这听起来很愚蠢。
所以2个表ORDER和ORDERDETAILs
ORDER_ID ITEM_NAME
======== =========
111 Paper
111 Toner
222 Paper
333 Pencils
我想只查询Order_ID,而ITEM_Name是Paper
所以例如我的查询结果应该是
ORDER_ID ITEM_NAME
======== =========
222 Paper
我不希望ORder_ID具有与之相关的其他项目。我只想要ORDERID是唯一的ITEM_Name是Paper。
答案 0 :(得分:0)
SELECT OrderDetails.*
FROM OrderDetails
WHERE ITEM_Name = 'Paper'
AND Order_ID NOT IN (SELECT Order_ID FROM OrderDetails WHERE ITEM_Name <> 'Paper')
在此选项中,您选择item_name ='Paper'的所有项目。然后排除所有包含&lt;&gt;行的订单'纸'
<强>候补:强>
如果我们可以假设Item_Name对于每个订单都是唯一的,那么(至少在MS SQL Server中)你可以这样做:
;with NumberOfRows as
(
SELECT COUNT(1) as TotalRows, Order_ID
FROM OrderDetails
GROUP BY Order_ID
)
SELECT OrderDetails.*
FROM OrderDetails
INNER JOIN NumberOfRows
ON NumberOfRows.Order_ID = OrderDetails.OrderID
AND NumberOfRows.TotalRows = 1
WHERE OrderDetails.Item_Name = 'Paper'
作为另一种选择:
select OrderDetails1.*
from OrderDetails as OrderDetails1
LEFT JOIN OrderDetails OrderDetails2
ON OrderDetails1.Order_ID = OrderDetails2.Order_ID
AND OrderDetails2.ITEM_Name <> 'Paper'
Where ITEM_Name = 'Paper'
AND OrderDetails2.Order_ID IS NULL
在最后一个中,你得到了所有的订单,并加入到他们自己的第二行不是纸张的地方。然后排除连接成功的所有订单。如果订单明细表有一些独特的东西(比如行ID),这将更容易理解。
答案 1 :(得分:0)
如果您想要仅纸张的订单ID,我建议您使用group by
和having
条款:
select od.Order_Id
from OrderDetails od
group by od.Order_Id
having sum(case when od.Item_Name = 'Paper' then 1 else 0 end) > 0 and
sum(case when od.Item_Name <> 'Paper' then 1 else 0 end) = 0
having
子句有两个条件。第一个计算具有Paper
作为项目的订单的行数。 > 0
表示至少需要一个。第二个计算没有纸张的行数。 = 0
表示不需要。
这也可以写成:
having sum(case when od.Item_Name = 'Paper' then 1 else 0 end) = count(*)
即。订单的所有商品均为“纸张”。
我喜欢这种方法,因为它很通用。您可以轻松扩展它包括剪刀和岩石。或者获得有纸张但没有石头的订单,等等。
答案 2 :(得分:0)
我认为我遇到了你的问题,但我不确定 kk。
如果您想在表格中选择一个字段:
SELECT ORDER_ID FROM tablesname WHERE ITEM_NAME = 'Paper';
如果你想从其他表中选择一个字段,你应该在它们之间建立关系。