2 outer joiny w kwerendzie

0

Witam,

Zaczynam się uczyć Accessa jako wprowadzenie do baz danych (SQLa jeszcze nie znam, więc bez takich przykładów w tym wątku ^^) i mam pytanie odnośnie 2 outer joinów w jednej kwerendzie. Zgodnie z tą stroną:

http://support.microsoft.com/KB/124937

błąd o nazwie ambiguous outer join jest wywołany wtedy kiedy outer join pokazuje na jedną tabelę, która bierze udział w innym joinie (obojętnie czy inner czy outer), ponieważ nie można ustalić kolejności łączenia rekordów.

Aczkolwiek takie połączenia są możliwe - wszystkie joiny w jedną stronę, lub jedna tabela w środku pokazująca na dwie inne:

Consultants <--- Active Consultants <--- Projects
Consultants ---> Active Consultants ---> Projects

Consultants <--- Active Consultants ---> Projects

Mam problem ze zrozumieniem tych dwóch pierwszych przykładów - jak je interpretować?

Najlepiej żeby ktoś mi to wytłumaczył na przykładzie tegorocznej matury z infy.

http://cke.edu.pl/images/files/matura/arkusze_2014/informatyka_PR_2_A1.pdf w zadaniu 6, podpunkt c). Utworzyłem 3 kwerendy, każda zsumowała ilość uwzględnień danego przedszkola jako preferencje nr 1, 2 i 3 (odpowiednio kwerendy "Odpowiedź c) - 1", "Odpowiedź c) - 2" i "Odpowiedź c) - 3"). Później 4. kwerenda korzystająca z tych trzech i mająca 2 outer joiny - odpowiedź jest poprawna i jedno przedszkole jest wyświetlone:

user image

Jeśli jednak zmienię tylko układ joinów na taki:

user image

To wyświetlane są dwa przedszkola - jedno to co wcześniej (same preferencje jako 1, żadnych 2 i 3) ale także drugie, które (sprawdziłem w tabelach) występuje z preferencjami 1 i 3 (pomimo wyraźnego warunku Is Null dla preferencji 3!). Dlaczego tak się dzieje?

0

Pokaż SQL-e

0

Dla pierwszego zdjęcia:

SELECT [Odpowiedz c) - 1].Nazwa_przedszkola, [Odpowiedz c) - 1].CountOfId_przedszkola AS Ile_osob_wybralo
FROM ([Odpowiedz c) - 1] LEFT JOIN [Odpowiedz c) - 2] ON [Odpowiedz c) - 1].Nazwa_przedszkola = [Odpowiedz c) - 2].Nazwa_przedszkola) LEFT JOIN [Odpowiedz c) - 3] ON [Odpowiedz c) - 1].Nazwa_przedszkola = [Odpowiedz c) - 3].Nazwa_przedszkola
WHERE ((([Odpowiedz c) - 2].Numer_preferencji) Is Null) AND (([Odpowiedz c) - 3].Numer_preferencji) Is Null));

Dla drugiego zdjęcia:

SELECT [Odpowiedz c) - 1].Nazwa_przedszkola, [Odpowiedz c) - 1].CountOfId_przedszkola AS Ile_osob_wybralo
FROM ([Odpowiedz c) - 1] LEFT JOIN [Odpowiedz c) - 2] ON [Odpowiedz c) - 1].Nazwa_przedszkola = [Odpowiedz c) - 2].Nazwa_przedszkola) LEFT JOIN [Odpowiedz c) - 3] ON [Odpowiedz c) - 2].Nazwa_przedszkola = [Odpowiedz c) - 3].Nazwa_przedszkola
WHERE ((([Odpowiedz c) - 2].Numer_preferencji) Is Null) AND (([Odpowiedz c) - 3].Numer_preferencji) Is Null));
0

Dobra nie wiem jak to wyjaśnić bo musiałbyś ogarnąć SQL-a a jakiś access MS to nieporozumienie jest. W każdym razie tak w pierwszym przypadku łączysz tabele 1 z 2 i tabele 1 z 3 i dla każdej z nich dajesz warunek logiczny IS NULL połączony AND czyli OBA muszą być spełnione i masz wynik jedno przedszkole ta daaaam.

W drugim przypadku łączysz szeregowo czyli tabela 1 i tabela 2 oraz tabela 2 i tabela 3 ale jeżeli tu chcesz zastosować warunek to musisz to zrobić blokowo. Czyli najpierw podzapytanie dla zestawu (tabela 2 i tabela 3) i wynik np nazywasz do zmiennej AS TAB23 a potem rozpatrujesz drugi warunek (tabela 1 i TAB23) i tu warunek IS NULL

A daj zapytanie

SELECT [Odpowiedz c) - 1].Nazwa_przedszkola, [Odpowiedz c) - 1].CountOfId_przedszkola AS Ile_osob_wybralo
FROM ([Odpowiedz c) - 1] LEFT JOIN [Odpowiedz c) - 2] ON [Odpowiedz c) - 1].Nazwa_przedszkola = [Odpowiedz c) - 2].Nazwa_przedszkola) LEFT JOIN [Odpowiedz c) - 3] ON [Odpowiedz c) - 2].Nazwa_przedszkola = [Odpowiedz c) - 3].Nazwa_przedszkola
WHERE ((([Odpowiedz c) - 2].Numer_preferencji) IS NULL) OR (([Odpowiedz c) - 3].Numer_preferencji) IS NULL));

zmieniłem AND na OR i ciekawe co wyjdzie bo śpie i nie znam się aż tak bardzo na tym. Ale chyba coś w dobrym kierunku myśle.

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