Почему SQL вынуждает меня повторить все неагрегированные поля из своего ИЗБРАННОГО пункта в моем пункте GROUP BY? [закрытый]

33
задан Nathan 5 March 2013 в 16:58
поделиться

7 ответов

Я склонен соглашаться с Вами - это - один из многих случаев, где SQL должен иметь немного более умные значения по умолчанию для сохранения нас всех некоторый ввод. Например, вообразите, было ли это законно:

Select ClientName, InvoiceAmount, Sum(PaymentAmount) Group By *

, где "*" предназначенный "все несовокупные поля". Если бы все знали, что это - то, как это работало, то не было бы никакого беспорядка. Вы могли sub в определенном списке полей, если бы Вы хотели сделать что-то хитрое, но нащельная рейка означает "всех их" (который в этом средстве контекста, весь возможный ).

Предоставленный, "*" означает что-то другое здесь, чем в ИЗБРАННОМ пункте, поэтому возможно, другой символ работал бы лучше:

Select ClientName, InvoiceAmount, Sum(PaymentAmount) Group By !

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

17
ответ дан 27 November 2019 в 19:27
поделиться

Поскольку они - две разных вещи, можно сгруппироваться объектами, которые не находятся в избранном РЕДАКТИРОВАНИИ пункта

:

кроме того, действительно ли безопасно сделать то предположение?

у меня есть 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
7
ответ дан 27 November 2019 в 19:27
поделиться

Я надеюсь/ожидаю, что мы будем скоро видеть что-то более всестороннее; урок истории SQL по предмету был бы полезен и информативен. Кто-либо? Кто-либо? Bueller?

Тем временем, я могу наблюдать следующее:

SQL предшествует принципу DRY, по крайней мере, до него он был зарегистрирован в Прагматически настроенный Программист .

Не весь DBS требуют полного списка: Sybase, например, счастливо выполнит запросы как

SELECT a, b, COUNT(*)
FROM some_table
GROUP BY a

..., который (по крайней мере каждый раз я случайно выполнил, такой монстр) часто приводит к такому огромному непреднамеренному recordsets, что охваченные паникой запросы быстро следуют, прося DBAs возвратить сервер. Результатом является своего рода частичное Декартово произведение, но я думаю, что это может главным образом быть отказ на части Sybase для реализации стандарта SQL правильно.

3
ответ дан 27 November 2019 в 19:27
поделиться

Возможно, нам нужна краткая форма - называют это GroupSelect

GroupSelect Field1, Field2, sum(Field3) From SomeTable Where (X = "3")

Таким образом, синтаксический анализатор должен только бросить ошибку при игнорировании агрегатной функции.

2
ответ дан 27 November 2019 в 19:27
поделиться

Серьезное основание для него состоит в том, что Вы получили бы неправильные результаты, как правило, если бы Вы не указывали все столбцы. Предположим, что у Вас есть три столбца, 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 требует полей.

2
ответ дан 27 November 2019 в 19:27
поделиться

На самом деле разве это не составило бы 100% времени? Существует ли случай, в котором у Вас может быть (несовокупный) столбец в выборе, который не находится в GROUP BY?

у меня нет ответа все же. Это, конечно, походит на неудобный момент для языка.

1
ответ дан 27 November 2019 в 19:27
поделиться

Я разделяю взгляды op, что повторение является немного раздражающим, особенно если несовокупные поля содержат тщательно продуманные операторы как IFS и функции и много других вещей. Было бы хорошо, если могла бы быть некоторая стенография в группе пунктом - по крайней мере, псевдоним столбца. Что касается столбцов числом может быть другая опция, хотя тот, который, вероятно, имеет их собственные проблемы.

1
ответ дан 27 November 2019 в 19:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: