Domanda

I want to select all the rows from a table, those are not present in ID column of another table.

For example my Table1 has below structure :

C1  C2  C3
--  --  --
1   A   Z
2   B   Y
3   C   X

My Table2 Looks like :

    D1  D2  
    --  --  
    1   A   
    2   Y
    3   X

My working query looks something like :

slect * from Table1
where (C2 NOT IN (Select D2 from Table2);

This works fine, but if I want to filter on basis of combination of both the columns (i.e. D1 & D2, then I cant write the query as :

slect * from Table1
where ((C1,C2) NOT IN (Select (D1,D2) from Table2);

Can anyone help me rectify the above query?

È stato utile?

Soluzione

Use NOT EXISTS:

SELECT t.* from Table1 t
WHERE NOT EXISTS
(
    SELECT 1 FROM Table2 t2
    WHERE t.C1 = t2.D1
    AND   t.C2 = t2.D2
)

Result:

C1  C2  C3
2   B   Y
3   C   X

Here's a Demo: http://sqlfiddle.com/#!3/81fdd/4/0

NOT EXISTS has lesss isues than NOT IN anyway:

Should I use NOT IN, OUTER APPLY, LEFT OUTER JOIN, EXCEPT, or NOT EXISTS?

Altri suggerimenti

SELECT T1.*
 FROM Table1 AS T1
 LEFT JOIN Table2 AS T2
   ON T2.D1 = T1.C1
  AND T2.D2 = T1.C2
WHERE T2.D1 IS NULL
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top