Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql将两个不相关的表合并为一个表_Sql - Fatal编程技术网

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

sql将两个不相关的表合并为一个表,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

我有桌子

表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
这就像把两张桌子并排放在一起


我卡住了!请帮忙

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

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中执行“完全外部连接”。