如何在SQL Server自连接中删除重复的行

问题描述 投票:4回答:2

我试图基于同一张表中的另一行来修改一个列的值,所以我正在使用自我连接,正在获得期望的更改,但是它选择了两行(原始行和修改过的行),我没有要选择原始行,如果其任何列正在被修改,则仅应选择已修改的行(如果其值已被修改),否则应选择原始行。我创建了一个类似的架构来阐述这个问题:

create table tbl
(
    id int not null,    
    status int not null,
    name varchar null,
    subject varchar null,
    result varchar null
);


/* Create few records in this table */
INSERT INTO tbl VALUES(1, 1, 'A', 'sub1', 'Pending');
INSERT INTO tbl VALUES(2, 2, 'A', 'all', 'Passed');
INSERT INTO tbl VALUES(3, 1, 'B', 'sub1', 'Pending');
INSERT INTO tbl VALUES(4, 3, 'B', 'sub2', 'Failed');
COMMIT;

SELECT distinct t1.id, t1.status, t1.name, t1.subject,
CASE 
    WHEN t1.status = 1 and t2.subject = 'all' and t2.status = 2 THEN 'Passed'
    WHEN t1.status = 1 THEN 'Pending'
    WHEN t1.status = 2 THEN 'Passed'
    WHEN t1.status = 3 THEN 'Failed'
END AS 'result'
FROM tbl t1 join tbl t2 on t1.name = t2.name  

-----结果----------------------------

1|1|A|sub1|Pending
1|1|A|sub1|Passed
2|2|A|all|Passed
3|1|B|sub1|Pending
4|3|B|sub2|Failed

[这里,具有ID: 1的行正在被复制,我不再希望第一行,因为我已基于原始表Result的第二行将其Passed列的值修改为subject: all (ID: 2)。] >

------预期结果-----------------------

1|1|A|sub1|Passed
2|2|A|all|Passed
3|1|B|sub1|Pending
4|3|B|sub2|Failed

我试图基于同一张表中的另一行来修改一个列的值,所以我正在使用自我连接,正在获得期望的更改,但是它选择了两行(原始行和修改过的行),我...

sql sql-server database distinct self-join
2个回答
0
投票

最后一个案例确实覆盖了前一个案例。


0
投票

我希望将其分解为不同的步骤。我将其转换为临时表,以便可以在环境中更轻松地运行它。

© www.soinside.com 2019 - 2024. All rights reserved.