sql将两个不相关的表合并为一个

时间:2013-07-18 14:11:17

标签: sql

我有桌子

表1

col1    col2    
a       b
c       d

和table2

mycol1  mycol2
e           f
g           h
i           j
k           l

我想将两个没有共同字段的表合并到一个表中,如下所示:

表3

col1    col2    mycol1  mycol2
a           b   e   f
c           d   g   h
null    null    i   j
null    null    k   l

即,就像将两张桌子并排放置一样。

我被困住了!请帮忙!

3 个答案:

答案 0 :(得分:14)

获取每个表中每行的行号,然后使用这些行号进行完全连接:

WITH CTE1 AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY col1) AS ROWNUM, * FROM Table1
),
CTE2 AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY mycol1) AS ROWNUM, * FROM Table2
)
SELECT col1, col2, mycol1, mycol2
FROM CTE1 FULL JOIN CTE2 ON CTE1.ROWNUM = CTE2.ROWNUM

这假定SQL Server> = 2005。

答案 1 :(得分:2)

选项1:单个查询

加入这两个表,如果你希望table1中的每一行只匹配table2中的一行,你以某种方式限制连接。计算每个表中的行号并加入该列。行号是特定于数据库的;这是mysql的解决方案:

SELECT
    t1.col1, t1.col2, t2.mycol1, t2.mycol2
FROM
    (SELECT col1, col2, @t1_row := t1_row + 1 AS rownum FROM table1, (SELECT @t1_row := 0) AS r1) AS t1
    LEFT JOIN
    (SELECT mycol1, mycol2, @t2_row := t2_row + 1 AS rownum FROM table2, (SELECT @t2_row := 0) AS r2) AS t2
    ON t1.rownum = t2.rownum;

这假定table1比table2长;如果table2更长,则使用RIGHT JOIN或切换t1和t2子选择的顺序。另请注意,您可以使用子选择中的ORDER BY子句分别指定每个表的顺序。

(见select increment counter in mysql

选项2:后期处理

考虑进行两次选择,然后将结果与您喜欢的脚本语言连接起来。这是一种更合理的方法。

答案 2 :(得分:1)

如果你描述为什么需要解决这个问题,这真的很好。我猜它只是练习sql语法?

无论如何,由于行没有连接它们的任何东西,我们必须创建一个连接。我选择了他们的价值观的顺序。此外,由于他们没有任何连接它们,这也引出了一个问题,为什么你想要首先将它们放在一起。

以下是完整的解决方案:http://sqlfiddle.com/#!6/67e4c/1

选择代码如下所示:

WITH rankedt1 AS
(
  SELECT col1
  ,col2
  ,row_number() OVER (order by col1,col2) AS rn1
  FROM table1
  )
,rankedt2 AS 
(
  SELECT mycol1
  ,mycol2
  ,row_number() OVER (order by mycol1,mycol2) AS rn2
  FROM table2
  )

SELECT
col1,col2,mycol1,mycol2
FROM rankedt1
FULL OUTER JOIN rankedt2
  ON rn1=rn2