sql将两个不相关的表合并为一个表
我有桌子 表1sql将两个不相关的表合并为一个表,sql,Sql,我有桌子 表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 n
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
这就像把两张桌子并排放在一起
我卡住了!请帮忙 为每个表中的每一行获取一个行号,然后使用这些行号执行完全联接:
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。如果您能描述一下为什么需要解决这个问题,那就太好了。我猜这只是为了练习sql语法 无论如何,由于这些行没有任何连接,我们必须创建一个连接。我选择了它们的价值顺序。此外,由于它们之间没有任何联系,这也引出了一个问题,即为什么首先要将它们放在彼此相邻的位置 以下是完整的解决方案: 选择代码如下所示:
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
选项1:单一查询 必须联接这两个表,如果希望表1中的每一行只与表2中的一行匹配,则必须以某种方式限制联接。计算每个表中的行号并连接该列。行号是特定于数据库的;以下是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;
这假设表1比表2长;如果表2较长,请使用右连接
或切换t1和t2子选择的顺序。还请注意,您可以使用子选项中的orderby
子句分别指定每个表的顺序
(见附件)
选项2:后处理
考虑进行两次选择,然后将结果与您最喜欢的脚本语言连接起来。这是一种更合理的方法。哪种RDBMS?很明显,您不希望交叉连接,但是您希望如何排列这些行。i、 为什么e,f和a,b搭配?通常当问题是这样的时候,你在做一些没有意义的事情。这些并排的桌子有什么用?如果您这样做只是为了在应用程序中显示数据,那么可能有比您建议的更好的方法。嗨,e,f不需要和a,b搭配。表3中的列对相互独立。结果表将由使用sharepoint的用户使用。给他们一张桌子玩要容易得多——这就是我被要求提供的,即使这没有意义!有些人只是让我做一个这样工作的报告,虽然说“sql不是那样工作的”很容易,但很难解释为什么这么难。我敢打赌这会出现很多。很好-除了这是RDBM特有的-其他人可能会使用ROWNUM@Randy:谢谢;我添加了RDBMS警告。这非常有效,不管哪个表更长,谢谢。问题solved@user4109:很高兴能提供帮助,欢迎来到StackOverflow。如果有机会,请将对您最有帮助的答案标记为答案。警告:如果您做的列超过两列,则可能会导致行数过多(即所有列中可能至少有一个空)。我发现的解决方法是从包含最多元素的表中进行最后的外部选择,并加入较短的列表,这不是一个理想的解决方案,因为您并不总是知道哪个列表最长。非常感谢这一点,@zimdanen answer,以及sqlfiddle解决方案。天哪,你太快了!这个要求我已经遇到好几次了。。这不是在练习sql语法!该表的最终目标是供配置sharepoint web部件的第三方使用。无论哪个表更长,这都非常有效,谢谢。当我需要通过继承从对应于另一个表的表中提取标识索引值时,Problem solvedI使用了它。没有其他特定数据链接这两个表,因为层次结构中最高的表由许多表继承,而这些表中的特定数据并不相关。我现在回头看你的答案!实际上,我不知道表1是否比表2长。最初的问题是这个问题的一个过于简单的例子。事实上,将有十几个表合并到一个视图中(即不是一个表,但这并不重要)。这十二张桌子的大小事先不知道。第三方获得了视图,因此选项2实际上不可行。@user4109顺便说一句,如果您不知道哪个会更长,您可以通过
UNION
左连接和右连接在mysql中执行“完全外部连接”。