选择所有空值,但仅选择一个不为空的

时间:2019-01-22 12:15:36

标签: 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,'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整理所有其他条目,在其他情况下保留数据。 对不起,我的英语不好。 我希望你明白我的意思:)

非常感谢!

1 个答案:

答案 0 :(得分:3)

您可以为此使用NOT EXISTS

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)
);