SQL Server 2008 - запрос, который соответствует обоим условиям - PullRequest
1 голос
/ 28 февраля 2011

Я пытаюсь найти клиента (CustomerID) с 1 и 4 на оставшиеся недели.Я использую следующий запрос:

SELECT  o.CustomerID, oi.RemainingWeeks
FROM    Orders o INNER JOIN
        OrderItems oi ON o.OrderID = oi.OrderID 
WHERE   (oi.OrderItemStatusID = 1) AND (oi.RemainingWeeks IN (1, 4)) 
ORDER BY o.CustomerID, oi.RemainingWeeks

Это находит клиентов, у которых есть 1 на оставшиеся недели или 4, но не те, у которых есть оба.Нужно ли мне изменить свое объединение, чтобы сделать эту работу?

Спасибо!

Ответы [ 2 ]

6 голосов
/ 28 февраля 2011

Главное, что нужно понять, это то, что из OrderItems никогда не будет отдельной строки с RemainingWeeks, равной 1 и 4. Поэтому вам нужно как-то задействовать несколько строк. Вы можете достичь этого с помощью агрегатов или просто выполнив второе соединение:

SELECT  o.CustomerID, oi1.RemainingWeeks,oi2.RemainingWeeks
FROM    Orders o INNER JOIN
        OrderItems oi1 ON o.OrderID = oi1.OrderID INNER JOIN
        OrderItems oi2 ON o.OrderID = oi2.OrderID
WHERE   (oi1.OrderItemStatusID = 1) AND (oi1.RemainingWeeks =1) AND
        (oi2.OrderItemStatusID = 1) AND (oi2.RemainingWeeks =4) 
ORDER BY
     o.CustomerID, oi1.RemainingWeeks,oi2.RemainingWeeks
3 голосов
/ 28 февраля 2011

Это проблема реляционного деления .Способ решить это с помощью агрегатов -

SELECT  o.CustomerID
FROM    Orders o INNER JOIN
        OrderItems oi ON o.OrderID = oi.OrderID 
WHERE   (oi.OrderItemStatusID = 1) AND (oi.RemainingWeeks IN (1, 4)) 
GROUP BY o.CustomerID
HAVING COUNT(DISTINCT oi.RemainingWeeks) = 2
ORDER BY o.CustomerID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...