MySQL - pomoc z zapytaniem z EXISTS

0

Hej, nie wiem czy się zapętliłem, w każdym razie, poniżej przedstawię o co mi chodzi.

  1. Mam dwie tabele:

a. Dispute as dis:

dis_id value value2
1 Kuba 33
2 Tomek 22
3 Mateusz 23
4 Andrzej 44
5 Grzegorz 45
6 Mariusz 42
7 Ania 43
8 Kasia 18
9 Basia 63
10 Zosia 53

b. Dispute Additional as da:

dis_add_id dis_id value1
1 5 Sklep
2 8 Dom
3 1 Sklep
4 2 Dom
5 10 Sklep

Chciałbym napisać zapytanie, które zwróci mi wszystkie rekordy z tabeli Dispute, które nie zostały użyte w tabeli Dispute Additional (nie występują), czyli:

dis_id value value2
3 Mateusz 23
4 Andrzej 44
6 Mariusz 42
7 Ania 43
9 Basia 63

Chciałbym iść w takim kierunku, ale coś robię nie tak. Jakieś wskazówki?

SELECT dis.dis_id
FROM dispute as dis
INNER JOIN DisputeAdditional as da
ON dis.dis_id = da.dis_id
WHERE NOT EXISTS
(
SELECT dis_add_id from DisputeAdditional
)
3

Zauważ, że where not exists (select ...) nie jest w żaden sposób skorelowane z zapytaniem "głównym" - warunek mówi jeśli coś istnieje w tabeli DisputeAdditional, zwróć FALSE i elo.

Prawdopodobnie potrzebujesz czegoś w stylu:

WHERE dis.dis_id NOT IN (
    SELECT dis_id FROM DisputeAdditional
)

(można by też to spróbować ograć za pomocą right join czy coś, choć sam preferuję where ... not in z racji na czytelność.)

3
  1. SELECT dis_add_id from DisputeAdditional zawsze coś zwróci, więc not exists zawsze da false. Brakuje Ci where w podzapytaniu wewnątrz exists.
  2. Raz robisz join do DisputeAdditional, drugi raz sprawdzasz not exists w DisputeAdditional. To się wyklucza.
select * from a
where not exists (
    select * from b where b.id = a.bId
)
2

Jak nie musisz to nie używaj EXISTS w MYSQLu - tak to tam działa źle, że może zabić wydajność nawet przy niedużej bazie.

1
SELECT dis.dis_id
FROM dispute AS dis
WHERE NOT EXISTS
(
  SELECT dis_add_id --choć w tym miejscu możesz pobrać cokolwiek, choćby NULL, czy *, to nie ma znaczenia 
  FROM DisputeAdditional da
  WHERE da.dis_id = dis.dis_id 
)

LUB

SELECT dis.dis_id
FROM dispute AS dis
LEFT JOIN DisputeAdditional AS da
  ON dis.dis_id = da.dis_id
WHERE da.dis_id IS NULL

1 użytkowników online, w tym zalogowanych: 0, gości: 1