Разностный запрос, но тот же результат

Мой запрос должен вернуть: заказ идентификатора, количество элементов в этом заказе, показать только верхний.

Первый запрос, который я сделал сам, - это советы. Оба дали мне тот же результат.

Поэтому мой вопрос: мое решение не так с этим запросом или просто показывает, как начинающий iam и делал такие плохие вещи.

Думаю, я не понимаю, почему я должен пойти для объединения двух таблиц в этот запрос, если я могу позвонить из одной таблицы

Работа над базой данных 'adventureWorks2012'

Мой запрос:

Select  Top 1
   SalesOrderID,
   COUNT(*) as Items
From 
   Sales.SalesOrderDetail
Group By 
   SalesOrderID
Order BY 
   Items DESC

Решение:

Select Top 1
   H.SalesOrderID,
   Count(*) as AmountItems
From 
   Sales.SalesOrderHeader As H JOIN SAles.SalesOrderDetail As D
      ON H.SalesOrderID = D.SalesOrderID
Group by 
   H.SalesOrderID
Order BY 
COUNT(*) DESC

sql,sql-server,

0

Ответов: 2


1 принят

Ваш запрос в порядке. Фактически, это лучше, чем другой запрос, предполагая, что все значения SalesOrderIDнаходятся SalesOrderHeader. Это очень разумное предположение (и это может быть гарантировано, если определено ограничение внешнего ключа).

Вы также используете псевдоним для ORDER BY. Это еще один плюс.

Я думаю, что ваш запрос проще, быстрее и показывает разумное знание SQL.


1

Если SalesOrderDetail.SalesOrderID является внешним ключом для SalesOrderHeader.SalesOrderID, тогда обеспечивается ссылочная целостность. Поэтому в этом случае это можно сделать без подключения к SalesOrderHeader. И просто группа по SalesOrderDetail.SalesOrderID

SELECT TOP 1
 d.SalesOrderID, 
 COUNT(*) as AmountItems
FROM Sales.SalesOrderDetail d
GROUP BY d.SalesOrderID
ORDER BY COUNT(*) DESC;

Но если SalesOrderDetail.SalesOrderID не будет внешним ключом? И вы хотите только рассчитывать на SalesOrderID, который действительно существует в SalesOrderHeader? Тогда присоединение к SalesOrderHeader обеспечит это.

SELECT TOP 1
 d.SalesOrderID, 
 COUNT(*) as AmountItems
FROM Sales.SalesOrderDetail d
JOIN SalesOrderHeader h ON h.SalesOrderID = d.SalesOrderID
GROUP BY d.SalesOrderID
ORDER BY COUNT(*) DESC;

Предположим, что SalesOrderID является основным ключом для SalesOrderHeader. Это так . И SalesOrderDetail.SalesOrderID является внешним ключом для SalesOrderHeader.SalesOrderID. Это так . Тогда ваш первый запрос - ок.

SQL, SQL-сервер,
Похожие вопросы