SQL Server 排除基于多列值的行

1yjd4xko  于 2022-12-17  发布在  其他
关注(0)|答案(2)|浏览(140)

我需要根据多个列条件排除行,如1)首先从列ID1中查找值“rev”,2)根据第一个条件(即Ref1)在列ID2中查找相应值,并排除包含第二列中的值的所有行。

ID1     ID2     VALUE
    post    Ref1    12
    post    Ref1    3
    rev     Ref1    12
    rev     Ref1    3
    post    Ref2    10
    post    Ref2    5

output

    ID1     ID2     VALUE
    post    Ref2    10
    post    Ref2    5
qhhrdooz

qhhrdooz1#

这里假设“rev”代表reversal或类似的东西,并且如果ID2和VALUE对于“post”和“rev”是相同的,那么它们彼此否定。
我用这个创建了你的表:

DROP TABLE IF EXISTS #table1;
CREATE TABLE #Table1 (ID1 VARCHAR(4), ID2 VARCHAR(4), VALUE INT);
INSERT INTO #Table1 (ID1, ID2, VALUE)
VALUES ('post', 'Ref1', 12),
       ('post', 'Ref1', 3),
       ('rev', 'Ref1', 12),
       ('rev', 'Ref1', 3),
       ('post', 'Ref2', 10),
       ('post', 'Ref2', 5);

然后,我编写了此查询,以便首先获取所有“post”行的数据,然后在ID2VALUE上进行自连接匹配,并且ID1现在必须为“rev”,然后在WHERE子句中添加一些内容,以便仅返回没有T2.ID1的行

SELECT T1.ID1,
       T1.ID2,
       T1.VALUE
FROM #Table1 AS T1
     LEFT JOIN #Table1 AS T2 ON T2.ID2 = T1.ID2 AND T2.VALUE = T1.VALUE AND T2.ID1 = 'rev'
WHERE T1.ID1 = 'post' AND T2.ID1 IS NULL;
1cosmwyk

1cosmwyk2#

当“rev”替换为“post”时,您可以先选择所有包含ID1 = 'post'的行,然后删除所有包含ID1 = 'rev'的记录。

SELECT * FROM tab WHERE [ID1] = 'post'
EXCEPT
SELECT 'post' AS [ID1], [ID2], [VALUE] FROM tab WHERE [ID1] = 'rev'

检查here演示。

相关问题