Wyszukanie rekordów tabeli które nie posiadają określonego rekordu w innej tabeli

0

Mam dwie tabele Apartment i Invoice. Invoice posiada klucz obcy do apartment. Invoice dodatkowo posiada kolumny date_from i date_to mówiące od kiedy do kiedy było to realizowane.
Chcę teraz wybrać wszystkie rekordy z apartment które nie mają żadnego rekordu invoice dotyczącego tego mieszkania. Takie mieszkanie może mieć wiele invoice(rachunków) dla różnych okresów czasowych.
Czyli przykładowo mieszkanie id1 ma dwa rachunki w marcu i kwietniu, natomiast ja chce wyszukać wszystkie mieszkania które w kwietniu nie mają rachunku. Stworzyłem takie zapytanie ale ono zwraca mi to mieszkania id1 ponieważ posiada ono w marcu i ten rekord jest w porządku. Pewnie to trzeba jakoś zsumować w podzapytaniu ale nie bardzo wiem jak.
Obecne zapytanie:

select APARTMENT.*
from APARTMENT
       left Join INVOICE I on APARTMENT.ID = I.APARTMENT_ID_FK
where NOT (('2019-04-01' between i.DATE_FROM and i.DATE_TO) or ('2019-04-30' between i.DATE_FROM and i.DATE_TO))
order by i.DATE_FROM, i.DATE_TO;

baza postgres

1

Raczej tak

select 
    APARTMENT.*
from 
    APARTMENT
    left Join INVOICE I on APARTMENT.ID = I.APARTMENT_ID_FK
                                      and (i.DATE_FROM between '2018-04-01' and '2019-04-30' 
                                              or i.DATE_TO between '2018-04-01' and '2019-04-30' )
WHERE
     I.APARTMENT_ID_FK is null
order by i.DATE_FROM, i.DATE_TO;
0

Dzięki, choć udało mi się napisać to zapytanie trochę inaczej

SELECT *
FROM APARTMENT
WHERE id NOT IN
    (SELECT DISTINCT APARTMENT_ID_FK
     FROM INVOICE i
     WHERE ((i.DATE_FROM BETWEEN '2019-04-01' AND '2019-04-30')
            OR (i.DATE_TO BETWEEN '2019-04-01' AND '2019-04-30')))
0

NOT IN i DISTINCT? Bez sensu narzut na grupowanie.
Poza tym nie zapomnij używając NOT IN wywalić Nulli z podzapytania.

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