Fabian Jeda

Fabian Jeda Specjalista S.L.,
PGL Lasy Państwowe

Temat: Kwerenda wybierająca

Witam
Mam mały problem z kwerendą wybierającą. Kwerenda wygląda następująco: połączyłem dwie tabele za pomocą wspólnego pola. Tabela "A" jest tabelą danych natomiast tabela "B" jest tabelą info dla tych danych, gdzie jedna dana z tabeli "A" ma kilka informacji z tabeli "B". W SQL w części "FROM" za pomocą polecenia LEFT OUTER JOIN połączyłem pola A.a = B.b tak aby uzyskać wszystkie dane z tabeli "A" i wszystkie info z tabeli "B" (nawet jeśli w tabeli "B" nie ma info dotyczących danych z tabeli "A" to wyświetla puste pola info). Aby uzyskać tylko interesujące mnie info z tabeli "B" z pola "B.c" w SQL w części "WHERE" wpisałem kryterium ((pole B.c) = 'xx' OR (pole B.c) is Null). Chciałem uzyskać wszystkie pola z tabeli "A" i tylko te pola z tabeli "B" w których B.c = 'xx' albo Null. Niestety polecenie jest błędne ponieważ wybiera tylko te dane z tabeli "A" (zamiast wszystkich danych) i tabeli "B" dla których B.c = 'xx' albo Null. Nie wiem jakie zastosować polecenie aby uzyskać potrzebne dane. Z góry dziękuję za pomoc.

Temat: Kwerenda wybierająca

Klauzula LEFT JOIN wybiera wszystkie rekordy tylko z jednej tabeli, nie z obu. A konkretnie z tej stojącej po lewej stronie sprzężenia. Przy zapisie:

A LEFT OUTER JOIN B ON A.id=B.id

Zostaną wybrane wszystkie rekordy z tabeli A (bez względu na to czy spełniają one warunek sprzężenia, czy też nie), natomiast z tabeli B tylko te rekordy, które spełniają warunek sprzeżenia, definiowany po klauzuli ON. Jeśli w tabeli B znalazłyby się rekordy nie posiadające swoich "odpowiedników" w tabeli A (a więc nie spełniające warunku sprzężenia), wówczas tych rekordów w skutek uruchomienia tak zdefiniowanego zapytania nie zobaczymy.

Stworzone zapytanie nie działa błędnie działa zgodnie ze swoim zapisem.

Wnioskuję na podstawie przedstawionych przez Ciebie informacji, że pomiędzy tabelą A i B istnieje relacja 1:n. Skoro dopuszczasz istnienie w tabeli B (występującej po stronie relacji n) domyślam się, że tabela A jest tabelą słownikową. W związku z czym nie zostały wymuszone więzy integralności, aby taki numer był możliwy. Rozumiem, że istniały ku temu jakieś przesłanki?
Np. tabela Wojewodztwa i tabela Studenci, przy założeniach do bazy, że możliwy jest przypadek przyjazdu studenta zza granicy (zakładając, iz rejestracji w bazie podlega tylko jego adres stały, w przeciwnym przypadku należałoby rejestrwać go tymczasowo w Polsce przypisując mu konkretne województwo)

Aby wybrac dane z obu tabel bez względu na to czy spełniają warunek sprzężenia czy też nie, należałoby w tym celu użyć sprzeżenia FULL JOIN, które w Access-ie nie jest jawnie dostępne. Można to załatwić składając w całość odpowiednio lewe i prawe, oraz wewnętrzne sprzężenie zewnętrzne złącznone operatorem UNION ALL, lub samo UNION jeśli chcemy pozbyć się duplikatów.

Tutaj więcej informacji:

http://www.databasejournal.com/features/msaccess/artic...

Jeśli dobrze zrozumiałem Twoje intencje, to stwórz nową kwerendę na podstawie kwerendy (z użyciem operatora UNION) dodając wcześniej definiowane przez siebie warunek ograniczający.Sebastian Ł. edytował(a) ten post dnia 26.02.11 o godzinie 20:13
Fabian Jeda

Fabian Jeda Specjalista S.L.,
PGL Lasy Państwowe

Temat: Kwerenda wybierająca

Tabela "A" jest tabelą planowanych czynności (kod czynność, ilość roboczogodzin itd.) tabela "B" jest tabelą informacyjną gdzie każda czynność z tabeli "A" ma kilka parametrów informacyjnych z tabeli "B" (ilość akordowa, nr podpisanej na nią umowy itd.). Stosują zapis A LEFT OUTER JOIN B ON A.id=B.id bez kryteriów otrzymiję wszystkie czynności z tabeli A i ich wszystkie infa z tabeli B jak również puste infa z tabeli B wg układu:
czynność_a, info_a
czynność_a, info_b
czynność_a, info_c
czynność_b, info_b
czynność_b, info_c
czynność_c, puste
Problem polega na tym, że potrzebuję wszystkie czynności z tabeli "A" a tylko jeden rodzaj info z tabeli "B" lub puste pole info, a trzeba dodać że nie zawsze jest on wpisany (czasami czynności nie mają wogóle info, czasami tylko niektóre rodzaje info ale np. akurat nie te które mnie interesuje). Zakładając kryterium w "WHERE" żeby pokazało konkretne info - "B.c = 'a'" albo puste "OR B.c = Null" kwerenda pokazuje tylko te czynności z tabeli A dla których w tabeli B info = info_a albo nie ma info wogóle. Jeżeli występuje inny rodzaj info np. info_b lub info_c albo obie na raz to nie pokazuje tej czynności z tabeli A. Dlatego nie wiem jakie zastosować kryterium albo może jest to kwestia odpowiedniej klauzuli JOIN. Próbowałem już na wszelkie sposoby ale narazie mam za małą wiedzę i doświadczenie żeby samemu rozwiazać ten problem dlatego będę wdzięczny za pomoc.

Temat: Kwerenda wybierająca

Zapis przy użyciu sprzężenia LEFT OUTER JOIN zwraca wszysktkie rekordy z tabeli A i tylko "pasujące" rekordy z tabeli B. Również takie rekordy z tabeli B w polu "info" nie ma wprowadzonej żadnej wartości, co oznacza ni mniej ni więcej, iż dla określonej czynności z tabeli A brak jest zdefiniowanych jakichkolwiek parametrów informacyjnych w tabeli B.

Rzeczą jak najbardziej oczywistą jest, że przy wymuszeniu warunku odśnie określonego pola w tabeli B nie będą widoczne wybrane rekordy z tabeli A, ponieważ między tymi tabelami istnieje referencja (innymi słowy dane te są ze sobą ściśle powiązane).

Nie wiem jak wygląda cały Twój schemat bazy i czy poprawnie został znormalizowany.
Zastanawia mnie chęć takiego przedstawienia danych. Czemu ma to służyć?
Michał Dziubek

Michał Dziubek Programista,
INFORM\'1

Temat: Kwerenda wybierająca

Najprościej to stwórz kwerende np taką:
select * from b where c = 'a'

i z tym zrób join'a

Brak efektu którego się spodziewasz wynika z tego że w tabeli b może być wpis odpowiadający tabeli a , ale nie spełniający kryterium i dlatego będzie przefiltrowany. filtr musi nastąpić przed złączeniem tabel



Wyślij zaproszenie do