Пара очень простых вопросов по SQL

Volshebnaya

<понимаю, что оба вопроса проще проверить практикой, но сейчас мне не на чем проверить, а мануалов нет под рукой>
Вопрос 1: можно ли использовать встроенное представление как один из операндов в соединении таблиц и давать ему имя? То есть допустима ли такая конструкция?
/*работаем с таблицей table с именами полей field1, field2...*/

SELECT b.field1, b.field2
FROM (SELECT....) a, table b

Вопрос 2: можно ли использовать в одном и том же запросе GROUP BY и WHERE?
То есть допустима ли такая конструкция:
SELECT field1, field2, MAX(field3)
FROM table
WHERE field2=1
GROUP BY field1, field2

0000

1. Не все СУБД такое поддерживают.
2. Да.

kruzer25

1) В некоторых СУБД можно, только лучше используй не table_descriptor table_nick, а table_descriptor AS table_nick. А вообще, если хочешь написать что-то не привязанное к конкретной СУБД, пиши через джойны.
2) Конечно, допустима. Только с таким условием, как у тебя, GROUP BY field1,field2 не имеет никакого смысла, всё равно field2 не меняется - можно было бы напистаь и GROUP BY field1. Да, такое замечание - если хочешь сравнивать не просто поля, а всякие там max-ы, sum-ы итп (которые появляются уже после группировки) - пиши их в having, синтаксис такой же, как и у where. Например, select students.* from students_scores,students where students.id = students_scores.student_id and student.country = 'ru' group by students.id having avg(students_scores.score) > 4.

Volshebnaya

Еще один простой вопрос - напишу тут, чтобы темы не плодить.
 
Надо понять, что делает один скрипт, но мне незнаком синтаксис вот в каком его месте:
 

SELECT client.Client_ID, Sum([Total_sum]*-1) AS Tot_End, Account.Stock_ID
FROM Account INNER JOIN client ON Account.Source_ID = client.Client_ID
WHERE Account.Operation_Date)<=[Oper_date]
GROUP BY client.Client_ID, Account.Stock_ID;

 
А именно вопрос такой: какую роль играют квадратные скобки, заключающие в себя имена полей Total_sum и Oper_date? Я знаю только один вариант применения квадр.скобок к имени поля - если оно содержит недопустимые символы вроде пробелов. Но тут наверняка что-то другое, а я хз что. (

pitrik2

что за СУБД?
имеет смысл в ее доках полазать

Volshebnaya

Да никакая. ( Абстрактная задачка по SQL.

Скорее всего, имелся в виду MS Access или MS SQL Server.

kruzer25

Я знаю только один вариант применения квадр.скобок к имени поля - если оно содержит недопустимые символы вроде пробелов
Даже это - не по стандарту

pitrik2

вот нагуглил
brackets are used when table/column names contain spaces or keywords.in
other cases brackets may be used also but also could be avoided.
The ANSI standard delimiter is to use double quotes which works in TSQL
assuming the QUOTED_IDENTIFIER option is ON. [] is an alternative notation
used in Access and SQLServer.
msdn

Volshebnaya

Хм. Ну может быть.
Просто в следующем куске того же скрипта конструкция почти такая же, но там под скобками Sum стоит ясное и понятное Account.Total_sum. И тогда зачем автор использовал подряд 2 разных стиля?
 
Если же [Total_sum] - действительно просто имя поля, то как оно может быть использовано без имени таблицы, к которой относится? Если бы было выражение [Account].[Total_sum]*(-1 все было бы хорошо.

0000

Если столбец есть в одной из таблиц, то допускается использование его имени без указания имени таблицы из которой он.

pitrik2

Если столбец есть в одной из таблиц, то допускается использование его имени без указания имени таблицы из которой он.
уточню: есть ТОЛЬКО в одной из таблиц
т.е. если в двух таблицах есть такое поле - то непонятно из какой таблицы мы имеем ввиду и тогда надо указывать

sinet

Контрпример:
select a, b, (select a from (select 1 a from dual union all select 2 a from dual) where A=b) c from (select 1 a, 2 b from dual)
Запрос без проблем отработает. :)

pitrik2

Контрпример
ну не совсем
противоречия с моим нету

sinet

Ну, если к словам придираться, то не "надо указывать", а "надо указывать, но не всегда обязательно".
Оставить комментарий
Имя или ник:
Комментарий: