CROSS JOIN可以用连接条件1 = 1的FULL JOIN代替吗?

时间:2019-05-09 04:04:42

标签: tsql

获取更多关于完全联接或交叉联接的优化查询

我需要返回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

1 个答案:

答案 0 :(得分:1)

CROSS JOINFULL 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