SQL加入等于加上那些不相等的笛卡儿

时间:2015-01-29 16:14:55

标签: sql sql-server join

我需要以这样的方式连接两个表:在输出中我有一个UNION:

  • 匹配记录的INNER JOIN
  • 那些不匹配的CARTESIAN(不包括上述记录,即匹配的) 也许这看起来像小蛋糕,但我需要以有效的方式做到这一点(对于比下面更复杂的查询)。

a:1 | 2 | 3 | 5 b:2 | 3 | 4 | 6

结果:(2,2)|(3,3)|(1,4)|(1,6)|(5,4)|(5,6)

你可以建议任何有用的技巧吗? (我在SQL Server 2012上工作) 谢谢!

2 个答案:

答案 0 :(得分:1)

我使用CTE来定义连接记录,如下所示:

WITH MatchedRows
AS
SELECT A.a, B.b FROM A a INNER JOIN B b ON A.a = B.b

SELECT MatchedRows.a, MatchedRows.b
FROM MatchedRows
UNION
SELECT A.a, B.b FROM A a, B b
WHERE A.a NOT IN (SELECT a FROM MatchedRows)
  AND B.b NOT IN (SELECT b FROM MatchedRows)

答案 1 :(得分:0)

你没有说出列名是什么,所以只称它们为Col。

SELECT A.Col, 
B.Col 
FROM A 
INNER JOIN B 
on A.Col = B.Col

UNION ALL

SELECT A.Col, 
B.Col 
FROM A 
CROSS JOIN B
WHERE A.Col NOT IN (SELECT B.Col FROM B)
AND B.Col NOT IN (SELECT A.Col FROM A)