SQL Server 不匹配时返回 TableAU 中的所有字段,匹配时只返回 Table
Posted
技术标签:
【中文标题】SQL Server 不匹配时返回 TableAU 中的所有字段,匹配时只返回 Table【英文标题】:SQL Server Return all fields in TableA when not matched and only TableB when matched 【发布时间】:2017-09-22 08:09:18 【问题描述】:我有两个表,当表 B 中不匹配时,我想返回表 A 中的所有数据,当表 B 与表 A 匹配时,我想返回表 B 中的所有数据。我已经解决了这个问题,但它很难看。
create table TEST.A
(TYPE varchar(50), AMOUNT INT, DESCRIPTION varchar(50), DATE datetime2)
create table TEST.B
(TYPE2 varchar(50), AMOUNT2 INT, DESCRIPTION2 varchar(50), DATE2 datetime2)
insert into TEST.A values
('apples',3,'fruit','2016-12-31'),
('bananas',2,'fruit','2016-12-15'),
('pears',7,'fruit','2016-12-11')
insert into TEST.B values
('shop2',1,'shops','2016-12-31')
需要结果;
这里是丑陋的代码:
SELECT TYPE, AMOUNT, DESCRIPTION, DATE, NULL TYPE2,NULL AMOUNT2,NULL DESCRPTION2,NULL DATE2
FROM TEST.A
EXCEPT
SELECT A.*, NULL TYPE2,NULL AMOUNT2,NULL DESCRPTION2,NULL DATE2
FROM TEST.A a
JOIN TEST.B b ON a.DATE = b.DATE2
UNION
SELECT NULL, NULL, NULL, NULL, TYPE2, AMOUNT2, DESCRIPTION2, DATE2
FROM TEST.B
ORDER BY 1 DESC
我在这里遗漏了一些东西,谁能给我一个漂亮的答案?
【问题讨论】:
【参考方案1】:我会用EXCEPT
重写第一部分,如下所示
SELECT TYPE, AMOUNT, DESCRIPTION, DATE, NULL TYPE2,NULL AMOUNT2,NULL DESCRPTION2,NULL DATE2
FROM TEST.A
WHERE NOT EXISTS (
SELECT 1 FROM TEST.B b WHERE a.DATE = b.DATE
)
也可以使用NOT IN
,但是,您必须小心使用 NULL 值。
SELECT TYPE, AMOUNT, DESCRIPTION, DATE, NULL TYPE2,NULL AMOUNT2,NULL DESCRPTION2,NULL DATE2
FROM TEST.A
WHERE a.DATE NOT IN(
SELECT b.DATE FROM TEST.B b WHERE b.Date IS NOT NULL
)
【讨论】:
SELECT TYPE, AMOUNT, DESCRIPTION, DATE, NULL TYPE2,NULL AMOUNT2,NULL DESCRPTION2,NULL DATE2 FROM TEST.A WHERE NOT EXISTS ( SELECT 1 FROM TEST.B b WHERE a.DATE = b.DATE2 ) UNION SELECT NULL, NULL, NULL, NULL, TYPE2, AMOUNT2, DESCRIPTION2, DATE2 FROM TEST.B
以上是关于SQL Server 不匹配时返回 TableAU 中的所有字段,匹配时只返回 Table的主要内容,如果未能解决你的问题,请参考以下文章
Tableau 与 Microsoft SQL Server 2017 的连接
Tableau Server 中的直接 SQL Server 连接,业务用户没有数据库的读取权限