Annoying join problem & frozen brain.

  • create table A

    (a int, b int)

    create table D

    (a int)

    insert into A values (1,1)

    insert into A values (2,1)

    insert into A values (1,2)

    insert into A values (4,2)

    -- this table has other values.

    insert into D values (1)

    insert into D values (2)

    insert into D values (3)

    insert into D values (4)

    -- I want to join A & D based on a values where A.b = 1

    SELECT * FROM D

    LEFT OUTER JOIN a

    ON A.a = D.a

    WHERE A.b = 1

    -- but have the D values 3 & 4 show up with NULL where the A values should be :

    -- like this:

    111

    221

    3 null null

    4 null null

    -- In reality, it's more complex based on a big IN clause that I'm trying to avoid using twice.

    SELECT * FROM D

    LEFT OUTER JOIN a

    ON A.a = D.a

    WHERE A.b = 1

    AND D.a IN

    (1,2,3,4)

    -- Appreciate any help!

  • SELECT a2.a, D.a

    FROM D

    LEFT JOIN

    (

    SELECT * FROM A

    WHERE A.b = 1

    ) AS a2

    ON a2.a = D.a

    WHERE D.a IN (1,2,3)

    oh dear. i think the act of clarifying in a post sorted my brain out & the above code does what I need. sorry to have bothered!!

    one of those days.

    πŸ™‚

  • Like this?

    SELECT * FROM D

    LEFT JOIN (SELECT *

    FROM

    A

    WHERE

    A.b = 1

    ) AS A

    ON D.a = A.B

    ==========================================================================================================================
    A computer lets you make more mistakes faster than any invention in human history - with the possible exceptions of handguns and tequila. Mitch Ratcliffe

  • Didn't see you had already sorted it!

    ==========================================================================================================================
    A computer lets you make more mistakes faster than any invention in human history - with the possible exceptions of handguns and tequila. Mitch Ratcliffe

  • You need to put the condition in the join clause:

    SELECT D.a, A.a, A.b

    FROM D

    LEFT OUTER JOIN A

    ON A.a = D.a And A.b=1

    WHERE A.b = 1 or A.b is null

  • In fact you don't need the WHERE clause:

    SELECT D.a, A.a, A.b

    FROM D

    LEFT OUTER JOIN A

    ON A.a = D.a And A.b=1

    ...but you've fixed it. Anyway - there are a few ideas there...

  • Thank you both!! Appreciate you taking the time.

    πŸ™‚

  • SELECT *

    FROM D

    LEFT OUTER JOIN a

    ON A.a = D.a

    WHERE

    A.b = 1 -- << this turns the LEFT OUTER JOIN into an INNER JOIN

    AND D.a IN (1,2,3,4)

    -- use this instead:

    SELECT *

    FROM D

    LEFT OUTER JOIN a

    ON A.a = D.a AND A.b = 1

    WHERE D.a IN (1,2,3,4)

    Ah, Laurie beat me to it.

    β€œWrite the query the simplest way. If through testing it becomes clear that the performance is inadequate, consider alternative query forms.” - Gail Shaw

    For fast, accurate and documented assistance in answering your questions, please read this article.
    Understanding and using APPLY, (I) and (II) Paul White
    Hidden RBAR: Triangular Joins / The "Numbers" or "Tally" Table: What it is and how it replaces a loop Jeff Moden

Viewing 8 posts - 1 through 7 (of 7 total)

You must be logged in to reply to this topic. Login to reply