I have 2 tables and I want to find only the different values in 2 columns on one of the tables (only the unique combination of 2 strings that is not in the first table )
for example : TABEL 1
ID1 | ID2 |
---|---|
X1 | X2 |
X3 | X4 |
X5 | X6 |
X3 | X4 |
X6 | X7 |
TABEL 2 (the table I want to take the values from that are not in table1 )
ID1 | ID2 |
---|---|
X1 | X2 |
X3 | X4 |
X5 | X6 |
X4 | X3 |
X1 | X9 |
X3 | X12 |
the output will be :
ID1 | ID2 |
---|---|
X1 | X9 |
X3 | X12 |
CodePudding user response:
You can use NOT EXISTS
:
SELECT t2.*
FROM Table2 t2
WHERE NOT EXISTS (
SELECT *
FROM Table1 t1
WHERE (t1.ID1 = t2.ID1 AND t1.ID2 = t2.ID2)
OR (t1.ID1 = t2.ID2 AND t1.ID2 = t2.ID1)
);
or:
SELECT t2.*
FROM Table2 t2
WHERE NOT EXISTS (
SELECT *
FROM Table1 t1
WHERE LEAST(t1.ID1, t1.ID2) = LEAST(t2.ID1, t2.ID2)
AND GREATEST(t1.ID1, t1.ID2) = GREATEST(t2.ID1, t2.ID2)
);
or:
SELECT t2.*
FROM Table2 t2
WHERE NOT EXISTS (
SELECT *
FROM Table1 t1
WHERE (t1.ID1, t1.ID2) IN ((t2.ID1, t2.ID2), (t2.ID2, t2.ID1))
);
or, with MINUS
:
SELECT ID1, ID2 FROM Table2
MINUS
SELECT ID1, ID2 FROM Table1
MINUS
SELECT ID2, ID1 FROM Table1;
See the demo.
CodePudding user response:
One option uses exists logic:
SELECT t2.ID1, t2.ID2
FROM Table2 t2
WHERE NOT EXISTS (
SELECT 1
FROM Table1 t1
WHERE t1.ID1 = t2.ID1 AND
t1.ID2 = t2.ID2
);
We can also use a left anti-join:
SELECT t2.ID1, t2.ID2
FROM Table2 t2
LEFT JOIN Table1 t1
ON t1.ID1 = t2.ID1 AND
t1.ID2 = t2.ID2
WHERE t1.ID1 IS NULL;
CodePudding user response:
SELECT T2.ID1,T2.ID2
FROM TABLE2 T2
MINUS
SELECT T1.ID1,T1.ID2
FROM TABLE1 T1