Sql server SQL根据多个条件筛选行并获取匹配的记录

Sql server SQL根据多个条件筛选行并获取匹配的记录,sql-server,Sql Server,您好,我有一个要求,我需要过滤具有多个条件的行,如果匹配中存在单个条目,则排除结果。这是我的样品表 DECLARE @CUSTOMER TABLE ( CUSTOMERID INT, CUSTOMERNAME NVARCHAR(100) ) DECLARE @ORDER TABLE ( ORDERID INT, CUSTOMERID INT, ISSPECIALORDER INT, SPECIALORDERID INT ) DECLARE @S

您好,我有一个要求,我需要过滤具有多个条件的行,如果匹配中存在单个条目,则排除结果。这是我的样品表

DECLARE @CUSTOMER TABLE
(
    CUSTOMERID INT,
    CUSTOMERNAME NVARCHAR(100)
)

DECLARE @ORDER TABLE
(
    ORDERID INT,
    CUSTOMERID INT,
    ISSPECIALORDER INT,
    SPECIALORDERID INT
)

DECLARE @SPECIALORDERDTL TABLE
(
    SPECIALORDERID INT,
    SPECIALORDERDATAID INT
)

DECLARE @SPECIALORDERDATA TABLE
(
    SPECIALORDERDATAID INT,
    SPECIALORDERMASTERID INT
)

INSERT INTO @CUSTOMER VALUES (100,'CUSTOMER1'),(200,'CUSTOMER2'),(300,'CUSTOMER3'),(400,'CUSTOMER4`enter code here`')

INSERT INTO @ORDER VALUES (1,100,0,1),(2,100,1,1),(3,100,1,2),(4,200,0,1),(5,200,1,1),(6,200,1,4),(7,300,1,5),(8,400,1,6)

INSERT INTO @SPECIALORDERDTL VALUES(1,1),(2,1),(3,2),(4,4)

INSERT INTO @SPECIALORDERDATA VALUES(1,1),(2,1),(3,1),(4,2),(5,2) -- 2 a special order

SELECT  C.CUSTOMERID,C.CUSTOMERNAME
FROM    @ORDER O
INNER JOIN @CUSTOMER C ON C.CUSTOMERID=O.CUSTOMERID

INNER JOIN @SPECIALORDERDTL SO ON SO.SPECIALORDERID = O.SPECIALORDERID
INNER JOIN @SPECIALORDERDATA SOD ON SO.SPECIALORDERDATAID = SOD.SPECIALORDERDATAID
WHERE SOD.SPECIALORDERID <> 2 AND O.ISSPECIALORDER =0
    GROUP BY C.CUSTOMERID,C.CUSTOMERNAME
    ORDER BY C.CUSTOMERNAME

当我在Apple OrthDigtl中有一个条目,Apple OrthOrrasMIDID为2时,我需要将它们视为特殊条目并排除它们。因此,我的查询应该只返回带有100的客户。

根据您的描述,似乎不是每个客户都会在SpecialLordErdtl或SpecialLordErdta中有一个条目,因此您不希望内部联接到这些表

您需要的是一个不存在相关子查询,以检查客户在这些表中是否没有匹配的行

因此,您可以删除特殊*表的内部联接,并添加如下内容:-

 where not exists (select null from SPECIALORDERDTL SO where
 SO.SPECIALORDERID = O.SPECIALORDERID and SO.SPECIALORDERMASTERID = 2)
根据您的描述,我不太确定SOD.SPECIALORDERID 2和O.ISSPECIALORDER=0在何处适合,因此如果无法使用子查询解决问题,请提供输出的进一步详细信息

根据您的说明,请尝试以下内容:-

SELECT  distinct C.CUSTOMERID,C.CUSTOMERNAME
FROM    @ORDER O
INNER JOIN @CUSTOMER C ON C.CUSTOMERID=O.CUSTOMERID
where not exists 
(select null from @SPECIALORDERDTL SO 
INNER JOIN @SPECIALORDERDATA SOD ON SO.SPECIALORDERDATAID = SOD.SPECIALORDERDATAID 
where SO.SPECIALORDERID = O.SPECIALORDERID and 
SOD.SPECIALORDERMASTERID = 2
)
order by C.CUSTOMERNAME

从您的描述或SQL中不清楚您到底想要什么。据我了解:


dbfiddle

假设我理解这个问题,我认为having子句中的条件聚合可能是获得所需结果的最简单方法:

SELECT C.CUSTOMERID, C.CUSTOMERNAME
FROM @CUSTOMER As C
JOIN @ORDER O 
    ON C.CUSTOMERID = O.CUSTOMERID
JOIN @SPECIALORDERDTL SO 
    ON O.SPECIALORDERID = SO.SPECIALORDERID
JOIN @SPECIALORDERDATA SOD
    ON SO.SPECIALORDERDATAID = SOD.SPECIALORDERDATAID
GROUP BY C.CUSTOMERID, C.CUSTOMERNAME
HAVING COUNT(CASE WHEN SOD.SPECIALORDERMASTERID = 2 THEN 1 END) = 0

having子句将筛选出至少一个与之关联的订单的SpecialLorderMasterId为2的每个客户。

是的,不是每个客户都有特殊订单,正如我所说,我有一个主表,其中存储了我在@SpecialLorderData和SpecialLorderMasterId 2So中引用的数据。当@SpecialLorderData和SpecialLorderMasterId 2中有一个条目时,它是一个特殊订单。我还需要一个帮助,即SpecialLorderData我有一个文件isactive,它将更新,如果我删除条目,它将添加一个输入0,如果我再次添加新订单,它将插入1。所以我需要活动1的最后一条记录,并过滤剩下的记录,因为我们正在做这件事。从评论中我很难理解这一点。我建议发布新问题。添加新问题 CUSTOMERID | CUSTOMERNAME ---------: | :----------- 100 | CUSTOMER1
SELECT C.CUSTOMERID, C.CUSTOMERNAME
FROM @CUSTOMER As C
JOIN @ORDER O 
    ON C.CUSTOMERID = O.CUSTOMERID
JOIN @SPECIALORDERDTL SO 
    ON O.SPECIALORDERID = SO.SPECIALORDERID
JOIN @SPECIALORDERDATA SOD
    ON SO.SPECIALORDERDATAID = SOD.SPECIALORDERDATAID
GROUP BY C.CUSTOMERID, C.CUSTOMERNAME
HAVING COUNT(CASE WHEN SOD.SPECIALORDERMASTERID = 2 THEN 1 END) = 0