【问题标题】:Merge two tables in SQL, with one common column在 SQL 中合并两个表,用一个公共列
【发布时间】:2020-01-23 09:00:16
【问题描述】:

我正在尝试合并到 MSSQL 中的表,如下面的示例所示。 我的情况与这个问题类似。 T-SQL merging two tables with common and uncommon columns

我尝试过使用以下查询:

select coalesce(t1.a, t2.a), t1.b, t1.c, t2.d, t2.k
from Table1_test t1
full outer join Table2_test t2 on t2.a = t1.a

但这会导致a列中具有相同值的行合并在同一行中

a   b   c      d    k
1   2   3      5    6
7   8   9     null  null
4 null  null   6    7
9 null  null   0    2

Table1_test:

a b c
1 2 3
7 8 9 

Table2_test:

a d k
4 6 7
1 0 2

我想要的合并表:

a   b   c      d    k
1   2   3     null  null
7   8   9     null  null
4 null  null   6    7
1 null  null   0    2

【问题讨论】:

    标签: sql sql-server join


    【解决方案1】:

    您可以使用UNION ALL

    SELECT a, b, c, NULL AS d, NULL AS k FROM table1_test
    UNION ALL
    SELECT a, NULL, NULL, d, k FROM table2_test
    

    您还可以使用带有错误匹配条件的FULL OUTER JOIN (1 = 2):

    SELECT COALESCE(t1.a, t2.a) AS a, t1.b, t1.c, t2.d, t2.k
    FROM Table1_test t1 FULL OUTER JOIN Table2_test t2 ON 1 = 2
    

    也可以生成上面的SQL查询(以防列很多,或者不想自己挑常用/不常用的列名):

    DECLARE @sql VARCHAR(MAX) = 'SELECT ' + (
      SELECT STUFF((SELECT ',' + + col FROM (
        SELECT CASE WHEN i1.t IS NOT NULL AND i2.t IS NOT NULL THEN 'COALESCE(' + i1.t + '.' + i1.COLUMN_NAME + ', ' + i2.t + '.' + i2.COLUMN_NAME + ') AS ' + i1.COLUMN_NAME ELSE COALESCE(i1.COLUMN_NAME, i2.COLUMN_NAME) END AS col, COALESCE(i1.COLUMN_NAME, i2.COLUMN_NAME) cname FROM (
        SELECT 't1' AS t, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Table1_test'
        ) i1 FULL OUTER JOIN (
        SELECT 't2' AS t, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Table2_test'
        ) i2 ON i1.COLUMN_NAME = i2.COLUMN_NAME
    
      ) cols ORDER BY cname FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
    ) + ' FROM Table1_test t1 FULL OUTER JOIN Table2_test t2 ON 1 = 2'
    
    EXECUTE(@sql)
    

    你可以把上面的脚本放到一个带有两个参数的存储过程中,让脚本更加灵活。您可以在演示中找到存储过程的示例。

    demo on dbfiddle.uk

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多