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我提出了一个替代方案。但我不知道它是否会更快。只能使用有限的样本数据。但是你也可以检查它是否需要一个额外的索引。