Skip to content Skip to sidebar Skip to footer

Force Partial Join Order In Sql Server

Edit: People are having a hard time understanding what i want. So here's pretty pictures that explains it in excruciating detail. First join Transactions to Strange: The results s

Solution 1:

As @AaronBertrand mentioned, I'm a little unclear on what you are trying to do, but if you are talking about changing your output, could you just use COALESCE? Example:

SELECT COALESCE(s.Value, d.Value, c.Value), t.*
FROM Transactions as t
LEFT JOIN Strange as s
ON t.id = s.tid
LEFT JOIN Down as d
ON t.id = d.tid
LEFT JOIN Charmed as c
ON t.id = c.tid

Solution 2:

Maybe this solution will help you:

SET ANSI_WARNINGS ON;
GO
BEGIN TRAN;

CREATETABLE dbo.TableA (
    TableAID INTPRIMARY KEY,
    DescriptionA VARCHAR(50) NOTNULL
);
INSERT dbo.TableA 
VALUES (1,'A-1'), (2,'A-2');

CREATETABLE dbo.TableB (
    TableBID INTPRIMARY KEY,
    DescriptionB VARCHAR(50) NOTNULL
);
INSERT dbo.TableB
VALUES (1,'B-1'), (2,'B-2'), (4,'B-4');

CREATETABLE dbo.TableC (
    TableCID INTPRIMARY KEY,
    DescriptionC VARCHAR(50) NOTNULL
);
INSERT dbo.TableC
VALUES (1,'C-1'),(3,'C-3'), (4,'C-4');
GO

CREATETABLE dbo.[Transaction] (
    TransactionID INTIDENTITYPRIMARY KEY,
    TranDate DATENOTNULL,
    Col1 INTNULL
);
INSERT dbo.[Transaction]
VALUES ('20120101', 1), ('20120202',2), ('20120303',3), ('20120404',4), ('20120505',5);
GO

SELECT*FROM    dbo.[Transaction] t
OUTER APPLY (
    SELECT*FROM TableA a WHERE t.Col1=a.TableAID
) j1 --first joinOUTER APPLY (
    SELECT*FROM TableB b WHERE j1.TableAID ISNULLAND t.Col1=b.TableBID --First condition will force the join order (dbo.TableA.TableAID should be NOT NULL)
) j2 --second joinOUTER APPLY (
    SELECT*FROM TableC c WHERE j1.TableAID ISNULLAND j2.TableBID ISNULLAND t.Col1=c.TableCID ---First two conditions will force the join order (dbo.TableA.TableAID & dbo.TableB.TableBID should be NOT NULL)
) j3 --third joinWHERE   j1.TableAID ISNOTNULLOR      j2.TableBID ISNOTNULLOR      j3.TableCID ISNOTNULLROLLBACK;

In this case, the join order is:

1) t.Col1=a.TableAID

2) if not 1) then t.Col1=b.TableBID

3) if not 1) and 2) then t.Col1=c.TableCID

Results:

TransactionIDTranDateCol1TableAIDDescriptionATableBIDDescriptionBTableCIDDescriptionC---------------------------------------------------------------------------------------12012-01-01 11A-1NULLNULLNULLNULL22012-02-02 22A-2NULLNULLNULLNULL32012-03-03 3NULLNULLNULLNULL3C-342012-04-04 4NULLNULL4B-4NULLNULL

Post a Comment for "Force Partial Join Order In Sql Server"