SQL 加入相等加上不相等的笛卡尔
SQL join on equal plus cartesian of those which not equal
我需要以这样的方式连接两个表,在输出中我有一个联合:
- 匹配记录的内连接
- 笛卡尔不匹配的(不包括上面的记录,即那些匹配)
也许这看起来像小菜一碟,但我需要以一种有效的方式进行(对于比下面这个复杂得多的查询)。
一:1|2|3|5
b: 2|3|4|6
结果:(2,2)|(3,3)|(1,4)|(1,6)|(5,4)|(5,6)
您有什么有用的建议吗? (我在 SQL Server 2012 上工作)
谢谢!
我会使用 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)
你没有说列名是什么,所以就叫它们 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)
我需要以这样的方式连接两个表,在输出中我有一个联合:
- 匹配记录的内连接
- 笛卡尔不匹配的(不包括上面的记录,即那些匹配) 也许这看起来像小菜一碟,但我需要以一种有效的方式进行(对于比下面这个复杂得多的查询)。
一:1|2|3|5 b: 2|3|4|6
结果:(2,2)|(3,3)|(1,4)|(1,6)|(5,4)|(5,6)
您有什么有用的建议吗? (我在 SQL Server 2012 上工作) 谢谢!
我会使用 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)
你没有说列名是什么,所以就叫它们 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)