SQL - 返回来自不同表的记录组,不包括特定行

时间:2016-08-11 15:11:02

标签: sql

我是编程和SQL的新手,很抱歉,如果我没有包含足够的信息。

[我有这两个由OrderID链接的表。表1包括OrderID和客户信息,如FirstName,LastName和Address。表2包括OrderID和订单详细信息,例如ItemName,Price和Quantity。

Table2中的每个OrderID可能包含多个具有相同OrderID的ItemName条目。] 1

CustInfo

OrderID     FirstName   LastName    Address
1           Bob         Pratt       123
2           Jane        Doe         456
3           John        Smith       789
4           Barbara     Walters     147

订单

OrderID     ItemName    Price       Quantity
1           Milk        4.00        1
1           Eggs        5.00        2
2           Cheese      5.00        1
2           Bread       5.00        1
3           Milk        4.00        2
4           Yogurt      5.00        2

我正在尝试发送一个查询,该查询将发回每个订单的列表,列出订单ID和ItemName以及其他信息,只要订单不包含特定类型的项目(将在ItemName中) )。因此,如果OrderID包含2个ItemName,其中一个是我不想要的,则整个订单(OrderID)不应出现在我的结果中。

例如,基于img包含,如果我想显示所有订单,只要它们没有Milk作为ItemName,结果应该只显示OrderID 2和4。

2   Cheese  5.00 1
2   Bread   5.00 1
4   Yogurt  5.00 2

这是我尝试过的,但即使Milk在技术上属于该OrderID,也会返回OrderID。

SELECT OrderID, FirstName, LastName, ItemName, Price, Quantity  
FROM CustInfo
JOIN Orders
ON CustInfo.OrderID = Orders.OrderID
WHERE ItemName != 'Milk'

你能帮忙吗?

3 个答案:

答案 0 :(得分:1)

select o.OrderID, o.ItemName, c.FirstName, c.LastName -- include other fields if needed
from Orders o
left join CustInfo c on o.OrderID = c.OrderID
where o.OrderID not in (
  select OrderID from Orders where ItemName = 'Milk'
)

答案 1 :(得分:0)

SELECT T1.OrderID, T1.FirstName, T1.LastName, T1.Address, T2.OrderID, T2.ItemName, T2.Price, T2.Quantity
FROM Table2 as T2
  LEFT JOIN Table1 as T1 ON T1.OrderID = T2.OrderID
WHERE T2.OrderID <> (SELECT OrderID FROM Table2 WHERE ItemName='Milk');

答案 2 :(得分:0)

如果您希望整个订单不显示,而不仅仅是单个行,您可以使用WHERE NOT EXISTS:

SELECT o.OrderID, d.ItemName, d.Price, d.Quantity
FROM Orders o
JOIN OrderDetails d ON o.OrderID=d.OrderID
WHERE NOT EXISTS
(
    SELECT * FROM OrderDetails d2
    WHERE o.OrderID=d2.OrderID
    AND d.ItemName = 'Milk'
)