获取更多关于完全联接或交叉联接的优化查询
我需要返回2表的可移植性组合输出。当table1有行但table2为空时,它将仍然能够返回行。我尝试了CROSS JOIN,但失败了。好像只有FULL OUTER JOIN ON使用联接过滤器1 = 1 可以获得正确的结果。还有其他更好的方法吗?
declare @table1 table (col1 int, col2 int )
declare @table2 table (col1 int, col2 int )
insert into @table1 select 1, 11 union all select 2, 22
union all select 1, 22
-- When @table2 is empty, CROSS JOIN is return empty rows.
select t1.*, ISNULL(t2.col1, 0), ISNULL(t2.col2, 0)
from @table1 t1 CROSS JOIN @table2 t2
order by t1.col1, t1.col2, t2.col1, t2.col2
-- When @table2 is empty, still show record from @table1 with zero values
select t1.*, ISNULL(t2.col1, 0), ISNULL(t2.col2, 0)
from @table1 t1 FULL OUTER JOIN @table2 t2
on 1=1
order by t1.col1, t1.col2, t2.col1, t2.col2
以下是我目前想要的结果,但是任何可能都会出错吗?或更好的实施?
-- When @table2 is empty, still show record from @table1 with zero values
select t1.*, ISNULL(t2.col1, 0), ISNULL(t2.col2, 0)
from @table1 t1 FULL OUTER JOIN @table2 t2
on 1=1
order by t1.col1, t1.col2, t2.col1, t2.col2
答案 0 :(得分:1)
CROSS JOIN
和FULL OUTER JOIN
不同...
CROSS JOIN
将创建现有行的笛卡尔积(每行)。一组a,b,c
和第二组x,y
将得到ax,ay,bx,by,cx,cy
。
如果表2中没有任何内容,结果应该是什么?
但是FULL OUTER JOIN
(在您的情况下始终为true-true )在任何情况下都将返回集合1的每一行,在任何情况下都将返回集合2的每一行。 / p>
尝试一下:
DECLARE @table1 TABLE (chr CHAR(1))
DECLARE @table2 TABLE (chr CHAR(1))
INSERT INTO @table1 VALUES('a'),('b'),('c');
INSERT INTO @table2 VALUES('x'),('y');
SELECT * FROM @table1 t1 CROSS JOIN @table2 t2;
SELECT * FROM @table1 t1 FULL OUTER JOIN @table2 t2 ON 1=1;
-两个SELECT都返回了相同的
a x
b x
c x
a y
b y
c y
-但是现在我们清空其中一张桌子
DELETE FROM @table2;
SELECT * FROM @table1 t1 CROSS JOIN @table2 t2;
SELECT * FROM @table1 t1 FULL OUTER JOIN @table2 t2 ON 1=1;
-现在CROSS JOIN
不返回任何内容(作为不包含任何内容的 product ),而FULL OUTER JOIN
返回带有{{1 }} @tbl1
的值。
NULL