我有桌子
表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
即,就像将两张桌子并排放置一样。
我被困住了!请帮忙!
答案 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