加入没有加入条件的表

时间:2010-09-01 23:39:02

标签: sql tsql

这看起来很简单,但我无法弄清楚。我想简单地将两张桌子连在一起。我不关心哪些值与哪个值配对。使用TSQL,这是一个例子:

declare @tbl1 table(id int)  
declare @tbl2 table(id int)  

insert @tbl1 values(1)  
insert @tbl1 values(2)  
insert @tbl2 values(3)  
insert @tbl2 values(4)  
insert @tbl2 values(5)  

select * from @tbl1, @tbl2  

这会返回6行,但是会产生什么样的查询(只是将表并排拍打):
1 3
2 4
null 5

4 个答案:

答案 0 :(得分:7)

您可以为每个表格行编号,然后加入行号:

WITH
Table1WithRowNumber as (
    select row_number() over (order by id) as RowNumber, id from Table1
),

Table2WithRowNumber as (
    select row_number() over (order by id) as RowNumber, id from Table2
)

SELECT Table1WithRowNumber.Id, Table2WithRowNumber.Id as Id2
FROM Table1WithRowNumber 
FULL OUTER JOIN Table2WithRowNumber ON Table1WithRowNumber.RowNumber = Table2WithRowNumber.RowNumber

编辑:已修改为使用FULL OUTER JOIN,因此您获取所有行(包含空值)。

答案 1 :(得分:5)

使用交叉连接

  Select * From tableA Cross Join TableB

但是要明白,对于TableA中的每一行组合,TableB中的每一行都会在输出中输入一行...

因此,如果表A有8行,而TableB有4行,那么你将获得32行数据...... 如果你想要少于那个,你必须指定一些连接标准,这将从输出中过滤掉额外的行

答案 2 :(得分:2)

嗯,这样可行:

Select A.ID, B.ID From
  (SELECT ROW_NUMBER () OVER (ORDER BY ID) AS RowNumber, ID FROM Tbl2 ) A
full outer join
  (SELECT ROW_NUMBER () OVER (ORDER BY ID) AS RowNumber, ID FROM Tbl1 ) B 
on (A.RowNumber=B.RowNumber)

答案 3 :(得分:0)

SQL1交叉连接也适用于此处。

Select * 
From tableA, TableB