Пара очень простых вопросов по SQL
1. Не все СУБД такое поддерживают.
2. Да.
2. Да.
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.
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.
Еще один простой вопрос - напишу тут, чтобы темы не плодить.
Надо понять, что делает один скрипт, но мне незнаком синтаксис вот в каком его месте:
А именно вопрос такой: какую роль играют квадратные скобки, заключающие в себя имена полей Total_sum и Oper_date? Я знаю только один вариант применения квадр.скобок к имени поля - если оно содержит недопустимые символы вроде пробелов. Но тут наверняка что-то другое, а я хз что. (
Надо понять, что делает один скрипт, но мне незнаком синтаксис вот в каком его месте:
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? Я знаю только один вариант применения квадр.скобок к имени поля - если оно содержит недопустимые символы вроде пробелов. Но тут наверняка что-то другое, а я хз что. (
что за СУБД?
имеет смысл в ее доках полазать
имеет смысл в ее доках полазать
Да никакая. ( Абстрактная задачка по SQL.
Скорее всего, имелся в виду MS Access или MS SQL Server.
Скорее всего, имелся в виду MS Access или MS SQL Server.
Я знаю только один вариант применения квадр.скобок к имени поля - если оно содержит недопустимые символы вроде пробеловДаже это - не по стандарту
вот нагуглил
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 TSQLmsdn
assuming the QUOTED_IDENTIFIER option is ON. [] is an alternative notation
used in Access and SQLServer.
Хм. Ну может быть.
Просто в следующем куске того же скрипта конструкция почти такая же, но там под скобками Sum стоит ясное и понятное Account.Total_sum. И тогда зачем автор использовал подряд 2 разных стиля?
Если же [Total_sum] - действительно просто имя поля, то как оно может быть использовано без имени таблицы, к которой относится? Если бы было выражение [Account].[Total_sum]*(-1 все было бы хорошо.
Просто в следующем куске того же скрипта конструкция почти такая же, но там под скобками Sum стоит ясное и понятное Account.Total_sum. И тогда зачем автор использовал подряд 2 разных стиля?
Если же [Total_sum] - действительно просто имя поля, то как оно может быть использовано без имени таблицы, к которой относится? Если бы было выражение [Account].[Total_sum]*(-1 все было бы хорошо.
Если столбец есть в одной из таблиц, то допускается использование его имени без указания имени таблицы из которой он.
Если столбец есть в одной из таблиц, то допускается использование его имени без указания имени таблицы из которой он.уточню: есть ТОЛЬКО в одной из таблиц
т.е. если в двух таблицах есть такое поле - то непонятно из какой таблицы мы имеем ввиду и тогда надо указывать
Контрпример:
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)
Запрос без проблем отработает.
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)
Запрос без проблем отработает.

Контрпримерну не совсем
противоречия с моим нету
Ну, если к словам придираться, то не "надо указывать", а "надо указывать, но не всегда обязательно".
Оставить комментарий
Volshebnaya
<понимаю, что оба вопроса проще проверить практикой, но сейчас мне не на чем проверить, а мануалов нет под рукой>Вопрос 1: можно ли использовать встроенное представление как один из операндов в соединении таблиц и давать ему имя? То есть допустима ли такая конструкция?
Вопрос 2: можно ли использовать в одном и том же запросе GROUP BY и WHERE?
То есть допустима ли такая конструкция: