SQL Server 2008 - 需要帮助合并2个表(笛卡儿)

时间:2012-09-21 20:09:02

标签: sql sql-server sql-server-2008 tsql

我有2个完全不相关的表,我需要将它们放在一起 - 每个表一列。当我尝试笛卡尔联合时,我最终得到了所有组合:

SELECT Field1, Field2 FROM Table1, Table2

结果:

Table1.Field1 Table2.Field2
---------------------------
1             1
1             2
1             3 
2             1
2             2
2             3
3             1
3             2
3             3

我需要它并排返回:

Table1.Field1 Table2.Field2
---------------------------
1             1
2             2
3             3 
这可能吗?提前致谢

修改

Table1.Table1IDs
----------------
1
2
3
4
5

Table2.Table2IDs
----------------
6
7
8
9
10

所需的输出(进入临时表/选择语句)

Table1.Table1IDs    Table2.Table2IDs
------------------------------------
1                   6
2                   7
3                   8
4                   9
5                   10

然后,我可以将插入到实际的表中,我需要进行插入:

INSERT INTO dbo.MTMObjects
    SELECT Table1IDs, Table2IDs 
    FROM [temp table or solution]

ANSWER 的 Bluefeet给了我一个想法,使用临时表和一个我可以用来加入的标识列。他的'更安全'是因为你并不依赖SQL的幽默来对两个记录集进行相同的排序,但这可能对下一个人有所帮助:

DECLARE @tmp_Table1 TABLE(ID int IDENTITY(1,1) NOT NULL, TableID1 int NOT NULL)
DECLARE @tmp_Table2 TABLE(ID int IDENTITY(1,1) NOT NULL, TableID2 int NOT NULL)

INSERT INTO @tmp_Table1 
    OUTPUT INSERTED.Field1
SELECT * FROM Table1

INSERT INTO @tmp_Table2 
    OUTPUT INSERTED.Field2
SELECT * FROM Table2

OUTPUT
SELECT tmp1.Field1, tmp2.Field2 
FROM @tmp_Table1 tmp1 INNER JOIN @tmp_Table2 tmp2 ON tmp2.ID = tmp1.ID

干杯!

3 个答案:

答案 0 :(得分:5)

你可以使用row_number()尝试这样的事情。这将强制基于row_number

的两个表之间的关系
select t1.col1, t2.col2
from
(
  select col1, row_number() over(order by col1) rn
  from table1
) t1
inner join
(
  select col2, row_number() over(order by col2) rn
  from table2
) t2
  on t1.rn = t2.rn

请参阅SQL Fiddle with Demo

答案 1 :(得分:0)

如果我理解......你唯一需要的是在where子句

中添加一个过滤器
SELECT Field1, Field2 FROM Table1, Table2 WHERE Table1.Field1=Table2.Field2

答案 2 :(得分:0)

如果表格的行数不完全相同,您应该更改最终解决方案以使用外部联接而不是内部联接。