Как использовать отдельный для столбца вместе с предложением where в SQL Server 2008? - PullRequest
0 голосов
/ 29 марта 2012

Я хочу получить отдельное значение для конкретного столбца, однако двуличность неправильно обрабатывается, если выбрано более 3 столбцов.

Запрос:

SELECT DISTINCT 
  ShoppingSessionId, userid 
FROM 
  dbo.tbl_ShoppingCart 
GROUP BY 
  ShoppingSessionId, userid 
HAVING
  userid = 7

Этот запрос создаетправильный результат, но если мы добавим еще один столбец, то результат будет неправильным.

Пожалуйста, помогите мне, поскольку я хочу использовать ShoppingSessionId как отдельное, за исключением случаев, когда я хочу использовать все столбцы из таблицы, включаяс предложением where.

Как я могу это сделать?

1 Ответ

5 голосов
/ 30 марта 2012

Ключевое слово DISTINCT применяется ко всей строке, а не к столбцу.

В настоящее время DISTINCT вообще не требуется, поскольку ваш сценарий уже гарантирует, что ShoppingSession отличается: путем указания столбца в GROUP BY и фильтрации по другому столбцу группировки (userid).

Когда вы добавляете третий столбец к GROUP BY и это приводит к дублированию ShoppingSession, это означает, что некоторые значения ShoppingSession связаны со многими различными значениями добавляемого столбца.

Если вы хотите, чтобы ShoppingSession оставался отличным после включения этого третьего столбца, вы должны решить, какие значения добавленного столбца следует оставить в выходных данных, а какие следует отбросить. Это называется агрегирование . Вы можете применить функцию MAX() к этому столбцу или MIN() или любую другую подходящую агрегатную функцию . Обратите внимание, что в этом случае столбец не должен быть включен в GROUP BY.

Вот иллюстрация того, о чем я говорю:

SELECT
  ShoppingSessionId,
  userid,
  <b>MAX(YourThirdColumn) AS YourThirdColumn</b>
FROM dbo.tbl_ShoppingCart
GROUP BY
  ShoppingSessionId,
  userid
HAVING userid = 7

Есть еще одна заметка по вашему запросу. Предложение HAVING обычно используется для фильтрации по агрегированным столбцам. Если ваш фильтр не включает агрегированные столбцы, лучше использовать предложение WHERE:

SELECT
  ShoppingSessionId,
  userid,
  MAX(YourThirdColumn) AS YourThirdColumn
FROM dbo.tbl_ShoppingCart
<b>WHERE userid = 7</b>
GROUP BY
  ShoppingSessionId,
  userid

Хотя оба запроса будут давать идентичные результаты, их эффективность будет разной, поскольку первый запрос должен будет извлечь все строки, сгруппировать / агрегировать их, а затем отбросить все строки, кроме userid = 7, но второй запрос сначала отбросит строки и только затем группируйте / объединяйте оставшиеся, что гораздо эффективнее.

Вы можете пойти еще дальше и исключить столбец userid из GROUP BY и получить его значение с помощью функции агрегирования:

SELECT
  ShoppingSessionId,
  <b>MAX(userid) AS userid,</b>
  MAX(YourThirdColumn) AS YourThirdColumn
FROM dbo.tbl_ShoppingCart
WHERE userid = 7
GROUP BY
  ShoppingSessionId

Так как все userid значения в вашем выводе должны содержать 7 (потому что это в вашем фильтре), вы можете просто выбрать максимальное значение для каждого ShoppingSession, зная, что оно всегда будет 7 .

...