gpt4 book ai didi

sql - 选择仅出现在两个表之一中的数据的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-02 22:55:17 27 4
gpt4 key购买 nike

如果我有两个这样的表:

CREATE TABLE #table1 (id INT, name VARCHAR(10))
INSERT INTO #table1 VALUES (1,'John')
INSERT INTO #table1 VALUES (2,'Alan')
INSERT INTO #table1 VALUES (3,'Dave')
INSERT INTO #table1 VALUES (4,'Fred')
CREATE TABLE #table2 (id INT, name VARCHAR(10))
INSERT INTO #table2 VALUES (1,'John')
INSERT INTO #table2 VALUES (3,'Dave')
INSERT INTO #table2 VALUES (5,'Steve')

我想查看仅出现在一个表中的所有行,最好的方法是什么?

我能想到的就是要么做:

SELECT * from #table1 except SELECT * FROM #table2
UNION
SELECT * from #table2 except SELECT * FROM #table1

或者类似的东西:

SELECT id,MAX(name) as name  FROM
(
SELECT *,1 as count from #table1 UNION ALL
SELECT *,1 as count from #table2
) data
group by id
HAVING SUM(count) =1

在本例中,这将返回艾伦、弗雷德和史蒂夫。

但是这些感觉真的很笨重 - 有没有更有效的方法来解决这个问题?

最佳答案

select coalesce(t1.id, t2.id)     id,
coalesce(t1.name, t2.name) name
from #table1 t1
full outer join #table2 t2
on t1.id = t2.id
where t1.id is null
or t2.id is null

完全外连接保证来自连接两侧的记录。无论两侧(您要查找的记录)都没有的记录,一侧或另一侧都将具有 NULL。这就是我们过滤 NULL 的原因。

COALESCE 的作用是保证显示非 NULL 值。

最后,值得强调的是,重复是通过 ID 检测的。如果您还希望按名称命名,则应将 name 添加到 JOIN 中。如果您只想按姓名加入,请仅按姓名加入。此解决方案(使用 JOIN)为您提供了这种灵 active 。

顺便说一句,由于您提供了 CREATEINSERT 代码,我实际上运行了它们,上面的代码是一个完全有效的代码。

关于sql - 选择仅出现在两个表之一中的数据的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6957053/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com