簡體   English   中英

在 SQL 中合並兩個表,一個公共列

[英]Merge two tables in SQL, with one common column

我正在嘗試合並到 MSSQL 中的表,如下面的示例所示。 我的情況和這個問題類似。 T-SQL 合並兩個具有常見列和不常見列的表

我嘗試使用以下查詢:

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

表1_測試:

a b c
1 2 3
7 8 9 

表2_測試:

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

您可以使用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

您還可以使用帶有錯誤匹配條件 ( 1 = 2 ) 的FULL OUTER JOIN

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)

可以把上面的腳本放到有兩個參數的存儲過程中,讓腳本更加靈活。 您可以在演示中找到存儲過程的示例。

dbfiddle.uk 上的演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM