2016-08-11 84 views
0

我是编程和SQL的新手,非常抱歉,如果我没有包含足够的信息。SQL - 返回不包含特定行的表中的记录组

[我有这2个表由一个OrderID链接。表1包括OrderID和客户信息,例如名字,姓氏和地址。表2包括订单ID和订单详细信息,如项目名称,价格和数量。

每个订单ID表2中可能具有相同的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 

我试图做一个查询,将发回每个订单的清单,列出OrderID和ItemName以及其他信息,只要该订单不包含特定类型的物品(这会在ItemName中)。所以如果一个OrderID包含2个ItemName,其中一个是我不想要的,那么整个订单(OrderID)就不应该显示在我的结果中。

例如,基于断IMG包括,如果我想显示所有的订单,只要他们没有牛奶作为ITEMNAME,结果应仅显示的OrderID 2和4

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

这是我尝试过的,但是这将返回OrderIDs,即使Milk在技术上是该OrderID的一部分。

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

你能帮忙吗?

+1

欢迎SO;在这里你可以找到一些有用的[问]和如何建立[mcve];一些出发点:将表格结构和样本数据发布为格式化文本,而不是图片,以便人们可以轻松构建测试用例,并发布您尝试的结果,错误和问题。 PS:是oracle还是mysql? – Aleksej

+1

既然你说你是新手:[提出一个好的结构化查询语言(SQL)问题](http://meta.stackoverflow.com/a/271056/4955425) – sstan

+1

我删除了不一致的数据库标记。请添加您实际使用的数据库的标签。 –

回答

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' 
) 
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'); 
+0

但是,您希望使用该项目的参数进行排除,而不是将其硬编码。 –

+0

请解释您的答案 –

+0

@SimonHänisch好的。选择您希望在查询结果中看到的项目,并且由于Table2包含的变量可以是我们用于FROM语句的排除因子。然后,我们加入表1中的信息,该信息包含与表2相同的orderID,并在这些匹配标准上进行左连接。然后,为了回答他的问题,我们用牛奶排除结果作为项目名称 –

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' 
) 
+0

此外,完全猜测表/列的名称。 – Simon

相关问题