【问题标题】:Join two tables into one by adding data of all tables sequentially通过将所有表的数据顺序添加来将两个表合并为一个
【发布时间】:2017-09-09 06:27:35
【问题描述】:

我在连接三个具有不同数据的表时遇到了问题。 假设我有 table1table2 像:

table1 :     table2:
ID1         ID2
-----        ----- 
1            102
2            103

我需要将这两个表加入到 table3 中:

table3
------
ID1    ID2
---    ---
1      102
2      103

我在 table1 和 table2 中应用交叉连接,但我得到了:

table3 :
ID1   ID2
---   ---
1     102
2     102
1     103 
2     103

【问题讨论】:

  • 您如何知道Table1.ID1 1 行与Table2.ID1 102 行匹配?按 ID 排序时,是否只是 one 的第一行匹配 next 的第一行?
  • 如果您假设只有行号将是引擎应该如何连接这些表,那么您需要指定它。您需要为每个表上的每一行创建一个数字,然后将它们加入该新列。交叉连接应该将第一列的每一列与第二列的每一列结合起来,它是两个表的笛卡尔积。可以使用 SQL 中的 ROW_NUMBER() 函数轻松创建该数字。 (docs.microsoft.com/en-us/sql/t-sql/functions/…)
  • 是的,我想匹配一个的第一行以匹配第二个的第一行。 @豆蛙
  • 向table2添加一行,并调整结果。

标签: sql join sql-server-2012


【解决方案1】:

如果您只是按每个表的 ID 排序,然后将第一行与第一行匹配 - 以下应该可以工作。

Select T1.ID1
     , T2.ID2
from (Select ID1, row_number() over (order by ID1) rownum from Table1) T1
inner join (Select ID2, row_number() over (order by ID2) rownum from Table2) T2
    on T1.rownum = T2.rownum

它为每个带有行号的表创建一个子查询,然后在行号上进行内部连接。

【讨论】:

    【解决方案2】:

    如果您的ID 并不总是按顺序排列,请使用:

    SELECT t1.ID1, T2.ID2
    FROM (SELECT ID1, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) rn FROM table1 ) t1
    INNER JOIN (SELECT ID2, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) rn FROM table2) t2
        ON t1.rn = t2.rn
    

    【讨论】:

      猜你喜欢
      • 2015-10-06
      • 1970-01-01
      • 1970-01-01
      • 2018-01-08
      • 2017-03-27
      • 2014-06-26
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多