Недостаточный результат SQL-запроса

Я использую базу данных Northwind: http://dev.assets.neo4j.com.s3.amazonaws.com/wp-content/uploads/Northwind_diagram.jpg

Я должен вывести все заказы, размещенные CustomerID ALFKI с более чем одним уникальным продуктом. Я получаю правильные заказы, но не могу понять, почему в каждом заказе печатается только одно название продукта.

Мой запрос:

SELECT a.OrderID, p.ProductName
FROM Products p 
INNER JOIN 'Order Details' a 
  ON (p.ProductID = a.ProductID) 
INNER JOIN Orders b 
  ON (a.OrderID = b.OrderID) 
WHERE (b.CustomerID = 'ALFKI') 
GROUP BY a.OrderID 
HAVING COUNT(DISTINCT a.ProductID) > 1

person Kagemand Andersen    schedule 03.10.2015    source источник
comment
Не используйте одинарные кавычки вокруг имен таблиц или столбцов. Используйте их только для строковых констант и констант даты. Я не могу понять, почему вы не получаете синтаксическую ошибку.   -  person Gordon Linoff    schedule 03.10.2015
comment
Проблема в GROUP BY, но я не могу понять, как еще проверить COUNT больше 1.   -  person Kagemand Andersen    schedule 03.10.2015
comment
Вам нужен подзапрос с GROUP BY и HAVING, чтобы получить OrderID... Затем вам нужен ваш основной запрос, чтобы выбрать детали, используя OrderID, возвращенные из подзапроса. К сожалению, в данный момент у меня нет доступного сервера, чтобы попробовать его, и я не смог найти в Интернете хорошую онлайн-копию NW с запросами.   -  person David Tansey    schedule 03.10.2015
comment
@DavidTansey Спасибо, это помогло. Раздражен теперь, что я не подумал о подзапросе для начала, но, эй, живи и учись. Спасибо еще раз!   -  person Kagemand Andersen    schedule 03.10.2015
comment
Нет проблем -- #SOreadytohelp   -  person David Tansey    schedule 03.10.2015
comment
Вы на самом деле выполняли исходный запрос на SQL Server или данные Northwind были скопированы в базу данных MySQL?   -  person shawnt00    schedule 03.10.2015
comment
Не могли бы вы добавить правильный синтаксис для дальнейшего использования в качестве ответа?   -  person cybork    schedule 03.10.2015


Ответы (1)


Вам нужно, чтобы GROUP BY и HAVING были частью подзапроса, при этом ваш основной запрос выбирает детали, используя список OrderID, возвращенный из подзапроса, в качестве критериев фильтрации. Попробуйте следующий синтаксис для T-SQL:

SELECT 
    a.OrderID, 
    p.ProductName
FROM 
    Products p 
    INNER JOIN [Order Details] a 
        ON (p.ProductID = a.ProductID) 
    INNER JOIN Orders b 
        ON (a.OrderID = b.OrderID) 
WHERE 
    a.OrderID IN 
    (
        SELECT a.OrderID
        FROM [Order Details] a 
        INNER JOIN Orders b 
            ON (a.OrderID = b.OrderID) 
        WHERE (b.CustomerID = 'ALFKI') 
        GROUP BY a.OrderID 
        HAVING  COUNT(DISTINCT a.ProductID) > 1
    ) 
person David Tansey    schedule 03.10.2015
comment
Пожалуйста, отметьте мой ответ как принятый — вы получите два дополнительных очка репутации для себя! - person David Tansey; 04.10.2015