Я склонен соглашаться с Вами - это - один из многих случаев, где SQL должен иметь немного более умные значения по умолчанию для сохранения нас всех некоторый ввод. Например, вообразите, было ли это законно:
Select ClientName, InvoiceAmount, Sum(PaymentAmount) Group By *
, где "*" предназначенный "все несовокупные поля". Если бы все знали, что это - то, как это работало, то не было бы никакого беспорядка. Вы могли sub в определенном списке полей, если бы Вы хотели сделать что-то хитрое, но нащельная рейка означает "всех их" (который в этом средстве контекста, весь возможный ).
Предоставленный, "*" означает что-то другое здесь, чем в ИЗБРАННОМ пункте, поэтому возможно, другой символ работал бы лучше:
Select ClientName, InvoiceAmount, Sum(PaymentAmount) Group By !
существует несколько других областей как этот, где SQL просто не является столь красноречивым, как это могло быть. Но в этой точке, это, вероятно, слишком укреплено для внесения многих больших изменений как этот.
Поскольку они - две разных вещи, можно сгруппироваться объектами, которые не находятся в избранном РЕДАКТИРОВАНИИ пункта
:
кроме того, действительно ли безопасно сделать то предположение?
у меня есть SQL-оператор
Select ClientName, InvAmt, Sum(PayAmt) as PayTot
, это "корректный", чтобы сервер предположил, что я хочу сгруппироваться ClientName И InvoiceAmount? Я лично предпочитаю (и думайте, что это более безопасно) иметь этот код
Select ClientName, InvAmt, Sum(PayAmt) as PayTot
Group By ClientName
, бросают ошибку, предлагая мне изменить код на
Select ClientName, Sum(InvAmt) as InvTot, Sum(PayAmt) as PayTot
Group By ClientName
Я надеюсь/ожидаю, что мы будем скоро видеть что-то более всестороннее; урок истории SQL по предмету был бы полезен и информативен. Кто-либо? Кто-либо? Bueller?
Тем временем, я могу наблюдать следующее:
SQL предшествует принципу DRY, по крайней мере, до него он был зарегистрирован в Прагматически настроенный Программист .
Не весь DBS требуют полного списка: Sybase, например, счастливо выполнит запросы как
SELECT a, b, COUNT(*)
FROM some_table
GROUP BY a
..., который (по крайней мере каждый раз я случайно выполнил, такой монстр) часто приводит к такому огромному непреднамеренному recordsets, что охваченные паникой запросы быстро следуют, прося DBAs возвратить сервер. Результатом является своего рода частичное Декартово произведение, но я думаю, что это может главным образом быть отказ на части Sybase для реализации стандарта SQL правильно.
Возможно, нам нужна краткая форма - называют это GroupSelect
GroupSelect Field1, Field2, sum(Field3) From SomeTable Where (X = "3")
Таким образом, синтаксический анализатор должен только бросить ошибку при игнорировании агрегатной функции.
Серьезное основание для него состоит в том, что Вы получили бы неправильные результаты, как правило, если бы Вы не указывали все столбцы. Предположим, что у Вас есть три столбца, col1
, col2
и col3
.
предположим Ваши данные похожи на это:
Col1 Col2 Col3
a b 1
a c 1
b b 2
a b 3
select col1, col2, sum(col3) from mytable group by col1, col2
дал бы следующие результаты:
Col1 Col2 Col3
a b 4
a c 1
b b 2
, Как это интерпретировало бы
select col1, col2, sum(col3) from mytable group by col1
, Мое предположение будет
Col1 Col2 Col3
a b 5
a c 5
b b 2
, Это явно плохие результаты. Конечно, чем более сложный запрос и больше соединений, тем менее вероятно случилось бы так, что запрос возвратит корректные результаты или что программист даже знал бы, были ли они неправильными.
Лично я рад, что group by
требует полей.
На самом деле разве это не составило бы 100% времени? Существует ли случай, в котором у Вас может быть (несовокупный) столбец в выборе, который не находится в GROUP BY?
у меня нет ответа все же. Это, конечно, походит на неудобный момент для языка.
Я разделяю взгляды op, что повторение является немного раздражающим, особенно если несовокупные поля содержат тщательно продуманные операторы как IFS и функции и много других вещей. Было бы хорошо, если могла бы быть некоторая стенография в группе пунктом - по крайней мере, псевдоним столбца. Что касается столбцов числом может быть другая опция, хотя тот, который, вероятно, имеет их собственные проблемы.