Tsql 交叉连接可以替换为连接条件为1=1的完全连接?
获取更多针对完全联接或交叉联接的优化查询 我需要从表2返回一个可移植性组合输出。当table1有行但table2为空时,它仍然能够返回行。我试图交叉连接,但失败了。使用联接筛选器1=1时似乎只有完全外部联接 可以得到正确的结果。还有其他更好的方法吗Tsql 交叉连接可以替换为连接条件为1=1的完全连接?,tsql,Tsql,获取更多针对完全联接或交叉联接的优化查询 我需要从表2返回一个可移植性组合输出。当table1有行但table2为空时,它仍然能够返回行。我试图交叉连接,但失败了。使用联接筛选器1=1时似乎只有完全外部联接 可以得到正确的结果。还有其他更好的方法吗 declare @table1 table (col1 int, col2 int ) declare @table2 table (col1 int, col2 int ) insert into @tabl
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
交叉连接
和完全外部连接
是不同的
交叉联接
将创建现有行的笛卡尔乘积(每行各有一行)。一组A、b、c
和第二组x、y
将产生ax、ay、bx、by、cx、cy
如果表2中没有任何内容,结果应该是什么产品
但是完全外部联接(在您的情况下为“始终为真”条件)将在任何情况下返回集合1的每一行,在任何情况下返回集合2的每一行
试试这个:
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;
--两次选择都返回了相同的值
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
不返回任何内容(因为没有内容的产品就是没有内容),而FULL-OUTER-JOIN
为@tbl2
返回@tbl1
的值,值为NULL
a NULL
b NULL
c NULL
谢谢你的回答。这与我的发现完全相同。