I have a table @MitoT with following code:
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);
and populate it wits some data:
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');
so for any Position there can exist a row with MitoResultID = @ResT or with MitoResultID = @ResC or with both.
Now I try a CTE that returns me every Position, BaseT (which is Base WHERE MitoResultID = @ResT) and BaseC (which is Base WHERE MitoResultID = @ResC) for all cases:
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
But apparently I'm doing it wrong because it shows only those Position for which both BaseT and BaseC exist.
Please help me understand what is wrong.
UPDATE: The result looks like:
| PositionT | PositionC | BaseT | BaseC |
|---|---|---|---|
| 5 | 5 | N | - |
| 6 | 6 | G | T |
| 3 | 3 | A | C |
| 1 | 1 | A | A |
So i'm missing the rows for Positions like 4, 9, or 11 for which BaseT or BaseC is NULL