Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 交叉连接可以替换为连接条件为1=1的完全连接?_Tsql - Fatal编程技术网

Tsql 交叉连接可以替换为连接条件为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

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

我需要从表2返回一个可移植性组合输出。当table1有行但table2为空时,它仍然能够返回行。我试图交叉连接,但失败了。使用联接筛选器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

交叉连接
完全外部连接
是不同的

交叉联接
将创建现有行的笛卡尔乘积(每行各有一行)。一组
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

谢谢你的回答。这与我的发现完全相同。