繁体   English   中英

SQL 根据条件忽略行

[英]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 byhaving子句:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM