Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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
用于合并集合的更好的T-SQL解决方案?_Sql_Sql Server_Tsql - Fatal编程技术网

用于合并集合的更好的T-SQL解决方案?

用于合并集合的更好的T-SQL解决方案?,sql,sql-server,tsql,Sql,Sql Server,Tsql,给定以下数据/模式: DECLARE @t1 TABLE ( Id int NOT NULL ) DECLARE @t2 TABLE ( Id INT NOT NULL, Val1 CHAR(1) NOT NULL ) DECLARE @t3 TABLE ( Id INT NOT NULL, Val2 CHAR(1) NOT NULL ) INSERT INTO @t1 VALUES (1) INSERT INTO @t2 VALUES (1, 'A

给定以下数据/模式:

DECLARE @t1 TABLE (
    Id int NOT NULL
)

DECLARE @t2 TABLE (
    Id INT NOT NULL,
    Val1 CHAR(1) NOT NULL
)

DECLARE @t3 TABLE (
    Id INT NOT NULL,
    Val2 CHAR(1) NOT NULL
)

INSERT INTO @t1 VALUES (1)
INSERT INTO @t2 VALUES (1, 'A')
INSERT INTO @t2 VALUES (1, 'B')
INSERT INTO @t2 VALUES (1, 'C')
INSERT INTO @t3 VALUES (1, '9')
INSERT INTO @t3 VALUES (1, '8')
我希望看到以下结果集:

Id,Val1,Val2
1,'A','9'
1,'B','8'
1,'C',NULL
现在添加以下内容:

INSERT INTO @t3 VALUES (1, '7')
INSERT INTO @t3 VALUES (1, '6')
我想看看这个:

Id,Val1,Val2
1,'A','9'
1,'B','8'
1,'C','7'
1,NULL,'6'
以下是我的想法:

DECLARE @t4 TABLE(
    Id INT NOT NULL,
    RowNumber INT NOT NULL,
    Val1 CHAR(1) NULL,
    Val2 CHAR(1) NULL
)

INSERT INTO @t4 (Id, RowNumber, Val1)
    SELECT Id, ROW_NUMBER() OVER(ORDER BY Id), Val1
        FROM @t2

MERGE @t4 T
USING(SELECT Id, ROW_NUMBER() OVER(ORDER BY Id) RowNumber, Val2 FROM @t3) S
ON (T.Id = S.Id AND T.RowNumber = S.RowNumber)
WHEN MATCHED THEN
    UPDATE SET T.Val2 = S.Val2
WHEN NOT MATCHED THEN
    INSERT (Id, RowNumber, Val2) VALUES (Id, RowNumber, Val2);

SELECT Id, Val1, Val2 FROM @t4

但我想知道是否有人能想出更简单的方法,使用SELECT with JOIN代替MERGE

ROW_NUMBER()OVER(ORDER BY Id)
在出现领带时是不确定的。没有具体的结果是可以保证的。所以
9
也可以与
B
@MartinSmith配对,这很好。我不在乎这个案子的顺序
;with q2 as (
    select
        Id,
        Val1,
        ROW_NUMBER() OVER(ORDER BY Val1) rn
    from @t2
), q3 as (
    select
        Id,
        Val2,
        ROW_NUMBER() OVER(ORDER BY Val2 DESC) rn
    from @t3
)
select 
    isnull(q2.Id, q3.Id) as Id, 
    q2.Val1, 
    q3.Val2
from 
    q2 full outer join
    q3 on q2.Id = q3.Id and q2.rn = q3.rn