【发布时间】:2011-10-20 21:16:18
【问题描述】:
如果我有两个这样的表:
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
在这种情况下,这将返回 Alan、Fred 和 Steve。
但是这些感觉真的很笨重 - 有没有更有效的方法来解决这个问题?
【问题讨论】:
标签: sql sql-server sql-server-2005 select