sql-server - CTE两次加入同一张表

标签 sql-server

我有一个表@MitoT,代码如下:

DECLARE @ResT UNIQUEIDENTIFIER = NEWID(), @ResC UNIQUEIDENTIFIER = NEWID();
DECLARE
    @MitoT TABLE (
        Pid UNIQUEIDENTIFIER NOT NULL PRIMARY KEY,
        MitoResultID UNIQUEIDENTIFIER NOT NULL,
        Position VARCHAR(10) NOT NULL,
        Base VARCHAR(10) NOT NULL);

并用一些数据填充它:

INSERT INTO @MitoT VALUES (NEWID(), @ResT, '1', 'A');
INSERT INTO @MitoT VALUES (NEWID(), @ResT, '3', 'A');
INSERT INTO @MitoT VALUES (NEWID(), @ResT, '4', 'A');
INSERT INTO @MitoT VALUES (NEWID(), @ResT, '5', 'N');
INSERT INTO @MitoT VALUES (NEWID(), @ResC, '1', 'A');
INSERT INTO @MitoT VALUES (NEWID(), @ResC, '3', 'C');
INSERT INTO @MitoT VALUES (NEWID(), @ResC, '5', '-');
INSERT INTO @MitoT VALUES (NEWID(), @ResT, '6', 'G');
INSERT INTO @MitoT VALUES (NEWID(), @ResC, '6', 'T');
INSERT INTO @MitoT VALUES (NEWID(), @ResT, '9', 'A');
INSERT INTO @MitoT VALUES (NEWID(), @ResC, '11', 'C');

所以对于任何 Position MitoResultID = @ResT 可以存在一行或 MitoResultID = @ResC或两者兼而有之。 现在我尝试一个 CTE,它每 Position 返回我一次, BaseT (即 Base WHERE MitoResultID = @ResT )和 BaseC (即 Base WHERE MitoResultID = @ResC )对于所有情况:

WITH Compare (PositionT, PositionC, BaseT, BaseC) AS (
    SELECT t.Position, c.Position, t.Base, c.Base
        FROM @MitoT t
        FULL OUTER JOIN @MitoT c ON t.Position = c.Position
        WHERE (t.MitoResultID = @ResT AND c.MitoResultID = @ResC)
        OR (t.MitoResultID = @ResT AND c.MitoResultID IS NULL)
        OR (t.MitoResultID IS NULL AND c.MitoResultID = @ResC)
        )
SELECT * FROM Compare

但显然我做错了,因为它只显示那些 Position BaseTBaseC存在。 请帮助我了解问题所在。

更新: 结果如下:

<表类="s-表"> <头> 位置T 位置C BaseT 基地C <正文> 5 5 N - 6 6 G T 3 3 一个 C 1 1 一个 一个

所以我遗漏了 BaseT 或 BaseC 为 NULL 的位置行,例如 4、9 或 11

最佳答案

正如 Nikola Markovinović 在他的评论中所建议的那样:

SELECT t.Position, c.Position, t.Base, c.Base FROM (select * from @MitoT t where MitoResultID = @ResT) t FULL OUTER JOIN (select * from @MitoT c where MitoResultID = @ResC) c ON t.Position = c.Position

这非常有效,CTE 现在看起来像:

WITH Compare (PositionT, PositionC, BaseT, BaseC) AS (
    SELECT t.Position, c.Position, t.Base, c.Base 
        FROM (select * from @MitoT t where MitoResultID = @ResT) t 
        FULL OUTER JOIN (select * from @MitoT c where MitoResultID = @ResC) c 
        ON t.Position = c.Position
    )
SELECT * FROM Compare

结果表:

<表类="s-表"> <头> 位置T 位置C BaseT 基地C <正文> 1 1 一个 一个 3 3 一个 C 5 5 N - 空 11 空 C 6 6 G T 9 空 一个 空 4 空 一个 空

关于sql-server - CTE两次加入同一张表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70707899/

相关文章:

mysql - Grails - [1 :N] Relationship issue

sql - 在 SQL Server 中将用户定义的表类型与临时存储过程一起使用

SQL Server 不同的

sql - 程序性能。 SQL Server、Dynamics AX 2012 R3 CU10

sql - 将存储过程的结果保存在表变量中

sql - 在同一查询中多次调用 CTE

sql - 如果 SQL Server 2008 记录不存在/存在,如何插入/更新?

sql-server - 在 SSRS 中将日期从 mm/dd/yyyy 转换为 dd/mm/yyyy

sql-server - sp_executesql 因参数而变慢

c# - 必须使用哪些命名空间才能使用 ADO.NET 连接到 SQL Server?