nim*_*_dk 2 sql sql-server join
我正在尝试合并到 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
Run Code Online (Sandbox Code Playgroud)
但结果是,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
Run Code Online (Sandbox Code Playgroud)
表1_测试:
a b c
1 2 3
7 8 9
Run Code Online (Sandbox Code Playgroud)
表2_测试:
a d k
4 6 7
1 0 2
Run Code Online (Sandbox Code Playgroud)
我想要的合并表:
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
Run Code Online (Sandbox Code Playgroud)
您可以使用以下命令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
Run Code Online (Sandbox Code Playgroud)
您还可以将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
Run Code Online (Sandbox Code Playgroud)
您还可以生成上述 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)
Run Code Online (Sandbox Code Playgroud)
您可以将上面的脚本放入带有两个参数的存储过程中,以使脚本更加灵活。您可以在演示中找到存储过程的示例。