Jak napisać selecta dla danych, których brakuje w tabeli pośredniczącej.

0

Nie jestem niestety dobry w temacie baz danych i próbuję się dopiero uczyć. Proszę więc o wyrozumiałość i pomoc w napisaniu następującego selecta.
Mam 3 tabele:
dokumenty [id_dokumnetu, numer];
uzytkownicy_dokumenty [id_uzydok, id_dokumnetu(FK), id_user(FK)];
uzytkownicy [id_user, nazwa];

  1. Tabela dokumenty i uzytkownicy_dokumenty łączą się relacją jeden do wielu.
  2. Tabela uzytkownicy i uzytkownicy_dokumenty również łączą się relacją jeden do wielu.
  3. Jeden dokument może być więc przypisany do wielu użytkowników, jak i jeden użytkownik może być przypisany do wielu dokumentów.

Założeni jest takie, że wszystkie dokumenty powinny być powiązane ze wszystkimi użytkownikami. Próbuję więc napisać zapytanie, które wyrzuci mi wszystkie rekordy dokumentów i użytkowników, które nie są jeszcze powiązane ze sobą. Czyli wszystkie dokumenty, których dany użytkownik jeszcze nie obsługuje (nie ma jeszcze powiązania w tabeli uzytkownicy_dokumnety)

select 
	d.id_dokumentu, d.numer, ud.*, u.user, u.nazwa
from 
	dokumenty d left join uzytkownicy_dokumenty ud on d.id_dokumentu = ud.id_dokumentu
	right join uzytkownicy uzy on uzy.id_user = ud.id_user
where
           not exists (select ud1.id_uzydok from uzytkownicy_dokumenty ud1 where ud1.id_user = uzy.id_user and ud1.id_dokumentu = d.id_dokumentu)

Będę wdzięczny za pomoc.

0
select 
  * 
from 
  dokumenty d
  left join uzytkownicy_dokumenty ud on d.id_dokumentu = ud.id_dokumentu
where
  ud.id_dokumentu is null

i na przyszłość pomogło by jakbyś podał jaka to baza

0

Dziekuję za szybką odpowiedź.
Tak więc korzystam z MS SQL.
Jeżeli chodzi o podane zapytanie to zwraca ono tylko wszystkie dokumenty, które nie są w ogóle powiązane z żadnym użytkownikiem.

  1. Chcę jednak uwzględnić możliwość, że dany dokument może być powiązany z częścią użytkowników, ale jeszcze nie ze wszystkimi.
  2. Poza tym potrzebuję oprócz informacji o dokumnecie również informacji o użytkownikach, którzy nie są przypisani do danych dokumnetów.
    Krótko mówiąc wskazać wszystkie nieistniejące powiązania pomiędzy dokumetem i użytkownikiem zwracając wszystkie niepowiązane dokumnety i użytkowników.
0
select d.id_dokumentu, d.numer, u.id_user, u.nazwa from dokumenty d, uzytkownicy u where convert(varchar(20), d.id_dokumentu)+' '+convert(varchar(20), u.id_user) not in (select convert(varchar(20), id_dokumentu)+' '+convert(varchar(20), id_user) from uzytkownicy_dokumenty)
0

tak wyświetli Ci wszystkie rekordy włącznie z wartościami null

SELECT * FROM dokumenty , uzytkownicy_dokumenty
WHERE dokumenty.id_dokumnetu(+) = uzytkownicy_dokumenty.id_dokumnetu

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