[英]SQL ignore rows based on criteria
这听起来很愚蠢。
所以 2 个表 ORDER 和 ORDERDETAILs
ORDER_ID ITEM_NAME
======== =========
111 Paper
111 Toner
222 Paper
333 Pencils
如果 ITEM_Name 是纸,我只想查询 Order_ID
所以例如我的查询结果应该是
ORDER_ID ITEM_NAME
======== =========
222 Paper
我不希望 ORder_ID 与其他项目相关。 我只希望 ORDERID 是唯一的 ITEM_Name 是纸。
如果您只需要纸质订单 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(*)
即订单的所有项目都是“纸”。
我喜欢这种方法,因为它非常通用。 您可以轻松地将其扩展为包括剪刀和石头。 或者获得有纸但没有石头的订单,等等。
我想我遇到了你的问题,但我不确定 kk。
如果要选择表中的字段:
SELECT ORDER_ID FROM tablesname WHERE ITEM_NAME = 'Paper';
如果你想从其他表中选择一个字段,你应该在它们之间建立关系。
示例: https : //www.sqlshack.com/learn-sql-types-of-relations/
如果您只想检索 order_ids:
select DISTINCT(ORDER_ID)
from orderdetails
where ITEM_NAME='PAPER'
AND ORDER_ID NOT IN
(SELECT DISTINCT(ORDER_ID) FROM ORDERDETAILS WHERE ITEM_NAME!='PAPER')
如果您想要订单中的所有列:
select *
from orderdetails
where ITEM_NAME='PAPER'
AND ORDER_ID NOT IN
(SELECT DISTINCT(ORDER_ID) FROM ORDERDETAILS WHERE ITEM_NAME!='PAPER')
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' 的所有项目。 然后排除所有具有 <> 'Paper' 行的订单
替代品:
如果我们可以假设 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),这将更容易理解。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.