14

我有桌子

表格1

col1    col2    
a       b
c       d

和表2

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

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

我被困住了!请帮忙!

4

3 回答 3

16

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

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。

于 2013-07-18T14:22:07.973 回答
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子选择中的子句单独指定每个表的顺序。

(请参阅mysql 中的选择增量计数器

选项 2:后处理

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

于 2013-07-18T15:28:03.887 回答
2

如果您描述为什么需要解决这个问题,那就太好了。我猜这只是为了练习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
于 2013-07-18T14:29:32.857 回答