Tsql 选择所有空值,但仅选择一个非空值

Tsql 选择所有空值,但仅选择一个非空值,tsql,sql-server-2017,Tsql,Sql Server 2017,我希望你能在这一点上帮助我: 我有一个关于这些数据的故事 CREATE TABLE dbo.T ( SG char(3) NOT NULL, SEQNUM int NOT NULL, CO varchar(3) NOT NULL, FS varchar(12), RS varchar(12) ); INSERT INTO dbo.T(SG,SEQNUM,CO,FS,RS) VALUES ('054',0,'010','P1',NULL), ('054',1

我希望你能在这一点上帮助我: 我有一个关于这些数据的故事

CREATE TABLE dbo.T
(
    SG char(3) NOT NULL,
    SEQNUM int NOT NULL,
    CO varchar(3) NOT NULL,
    FS varchar(12),
    RS varchar(12)
);
INSERT INTO dbo.T(SG,SEQNUM,CO,FS,RS)
VALUES
('054',0,'010','P1',NULL),
('054',1,'010','P2',NULL),
('054',10,'020','P3',NULL),
('054',11,'030','P4',NULL),
('054',12,'030','A1','A1'),
('054',13,'030','P5',NULL),
('054',14,'030','P6',NULL),
('154',10,'150','P7',NULL),
('154',14,'160','A2','A2'),
('154',15,'160','P8',NULL)
我需要实现的是这个输出

SG  SEQNUM  CO  FS      RS
054 0       010 'P1'    NULL
054 1       010 'P2'    NULL
054 10      020 'P3'    NULL
054 12      030 'A1'    'A1'
154 10      150 'P7'    NULL
154 14      160 'A2'    'A2'
因此,基本上,这背后的逻辑是当FS=RS仅保留此条目时,使用相同的SG和CO对所有其他条目进行排序。在其他情况下,保留数据。 对不起,我的英语不好。 我希望你明白我的意思:


提前多谢

您可以为此使用“不存在”

select *
from dbo.T t
where not exists
( 
  select 1
  from dbo.T d
  where d.SG = t.SG and d.CO = t.CO
    and d.FS = d.RS
    and (t.FS IS NULL OR t.RS IS NULL OR t.FS <> t.RS)
);
这也可以通过过滤不匹配项的左自联接来完成

select t.*
from dbo.T t
left join dbo.T d
  on d.SG = t.SG and d.CO = t.CO
 and d.FS = d.RS
 and (t.FS IS NULL OR t.RS IS NULL OR t.FS <> t.RS)
where d.SG is null
对dbfiddle的测试


请注意,该测试在SG&CO上放置了一个组合索引

很好,您将样本数据发布为DDL+DML,但是逻辑并不完全清楚。为什么下一行不在所需的输出中?”054',13',030',P5',NULL',054',14',030',P6',NULL',154',15',160',P8',NULL?谢谢你!工作起来很有魅力:但当它有很多行~5亿行时,速度会非常慢。有更快的查询吗?@jigga我提出了一个替代方案。但我不知道它是否会更快。只能使用有限的样本数据。但是你也可以检查它是否需要一个额外的索引。