Adam Aniołek

Adam Aniołek inż informatyk
specjalność systemy
informatyczne w
zarząd...

Temat: Jedno zapytanie do kilku tabel!

Witam.
Mam problem z następującą sprawą. Prubuję przeszukać 5 tabel w jednym zapytaniu. Zapytanie wygląda tak:
select T_pp.id_pp,T_pp.data_pisma,T_pp.temat,T_pp.F_klient,T_pp.F_odbiorca,T_pismo.* from T_pp,T_pismo where (T_pp.F_ldz=T_pismo.id_pisma and T_pismo.id_pisma=(select id_pisma from T_pismo where ldz='".$temp[0]."' and rok='".$temp[1]."'))
Union select T_pismo.*,T_pw.id_pw,T_pw.data,T_pw.temat as tematPW,T_pw.F_klient as F_klientPW,T_pw.F_nadawca from T_pismo,T_pw where (T_pw.F_ldz=T_pismo.id_pisma and T_pismo.id_pisma=(select id_pisma from T_pismo where ldz='".$temp[0]."' and rok='".$temp[1]."'))
Union select T_op.id_op,T_op.data_pisma as data_pismaOP,T_op.temat as tematOP,T_op.F_klient as F_klientOP,T_op.F_odbiorca as F_odbiorcaOP,T_pismo.* from T_op,T_pismo where (T_op.F_ldz=T_pismo.id_pisma and T_pismo.id_pisma=(select id_pisma from T_pismo where ldz='".$temp[0]."' and rok='".$temp[1]."'))
Union select T_pismo.*,T_ow.id_ow,T_ow.data as dataOW,T_ow.temat as tematOW,T_ow.F_klient as F_klientOW,T_ow.F_nadawca as F_nadawcaOW from T_pismo,T_ow where (T_ow.F_ldz=T_pismo.id_pisma and T_pismo.id_pisma=(select id_pisma from T_pismo where ldz='".$temp[0]."' and rok='".$temp[1]."'))

W miejscach $tmp[0] i [1] podstawiane są odpowiednie warotści. Zapyanie ma zwrócić odpowiednie dane jeśli w danej tabeli są, a jeśli nie ma to nic nie wyświetlać. Nie wiem czy dobrze to wytłumaczyłe. Serwer MySQL v5.0.45.
Mogę to zrobić w czterech zapytaniach ale chciałem w jednym. Może się nie da?
Adam

konto usunięte

Temat: Jedno zapytanie do kilku tabel!

Adam Aniołek:
Witam.
Mam problem z następującą sprawą. Prubuję przeszukać 5 tabel w jednym zapytaniu. Zapytanie wygląda tak:
select T_pp.id_pp,T_pp.data_pisma,T_pp.temat,T_pp.F_klient,T_pp.F_odbiorca,T_pismo.* from T_pp,T_pismo where (T_pp.F_ldz=T_pismo.id_pisma and T_pismo.id_pisma=(select id_pisma from T_pismo where ldz='".$temp[0]."' and rok='".$temp[1]."'))
Union select T_pismo.*,T_pw.id_pw,T_pw.data,T_pw.temat as tematPW,T_pw.F_klient as F_klientPW,T_pw.F_nadawca from T_pismo,T_pw where (T_pw.F_ldz=T_pismo.id_pisma and T_pismo.id_pisma=(select id_pisma from T_pismo where ldz='".$temp[0]."' and rok='".$temp[1]."'))
Union select T_op.id_op,T_op.data_pisma as data_pismaOP,T_op.temat as tematOP,T_op.F_klient as F_klientOP,T_op.F_odbiorca as F_odbiorcaOP,T_pismo.* from T_op,T_pismo where (T_op.F_ldz=T_pismo.id_pisma and T_pismo.id_pisma=(select id_pisma from T_pismo where ldz='".$temp[0]."' and rok='".$temp[1]."'))
Union select T_pismo.*,T_ow.id_ow,T_ow.data as dataOW,T_ow.temat as tematOW,T_ow.F_klient as F_klientOW,T_ow.F_nadawca as F_nadawcaOW from T_pismo,T_ow where (T_ow.F_ldz=T_pismo.id_pisma and T_pismo.id_pisma=(select id_pisma from T_pismo where ldz='".$temp[0]."' and rok='".$temp[1]."'))

W miejscach $tmp[0] i [1] podstawiane są odpowiednie warotści. Zapyanie ma zwrócić odpowiednie dane jeśli w danej tabeli są, a jeśli nie ma to nic nie wyświetlać. Nie wiem czy dobrze to wytłumaczyłe. Serwer MySQL v5.0.45.
Mogę to zrobić w czterech zapytaniach ale chciałem w jednym. Może się nie da?
Adam

Da się ... ale widzę tu parę problemów:

1. Próbuję a nie prubuję :)
2. Kolumny w każdym select muszą się nazywać identycznie, albo mieć identyczne aliasy.
3. Stosujesz Union, co automatycznie powoduje sortowanie wyników częsciowych w celu uzyskania końcowego. A to chyba niepotrzebne.

pkt 2 i 3 odniosłem do bazy Oracle, więc mogę się mylić jeśli chodzi o MySQL.

konto usunięte

Temat: Jedno zapytanie do kilku tabel!

Krzysztof P.:
2. Kolumny w każdym select muszą się nazywać identycznie, albo mieć identyczne aliasy.
Jestes pewien? Wydaje mi sie, ze jezeli chodzi o 'uniony' to wystarczy zgodnosc ilosci kolumn oraz ich typow. Nazwy nie maja znaczenia, przejmowane sa w tabeli wynikowej z pierwszego selecta. Chyba, ze zle Cie zrozumialem...
Adam Aniołek

Adam Aniołek inż informatyk
specjalność systemy
informatyczne w
zarząd...

Temat: Jedno zapytanie do kilku tabel!

1. zawsze miałem słabe 3= z polskiego ;)
2. No nie bardzo z tymi samymi nazwami kolumn bo potem jest problem z wyświetleniem danych na stronie, powtarzające się nazwy powodują wyświetlenie pierwszych pasujących wyników a nie wszystkich? Stosuję Union ponieważ inaczej mi nie przeszukuje w ogóle tabel, tylko pierwszą.
3. dzieki za zainteresowanie.
adam

konto usunięte

Temat: Jedno zapytanie do kilku tabel!

Adam Aniołek:
1. zawsze miałem słabe 3= z polskiego ;)

Firefox przypilnuje... wystarczy chcieć go zainstalować.
Dla IE też są rozwiązania - wystarczy chcieć.

Pozdrawiam.
Adam Aniołek

Adam Aniołek inż informatyk
specjalność systemy
informatyczne w
zarząd...

Temat: Jedno zapytanie do kilku tabel!

no cóż używam Opery, a FF również ale w miejszym wymiarze. :)
IE niestety pod moim systemem nie działa (albo ja nie umię go zainstalować)Adam Aniołek edytował(a) ten post dnia 31.01.08 o godzinie 19:36
Ryszard Lewandowski

Ryszard Lewandowski Koordynator ds
Analiz pion IT.

Temat: Jedno zapytanie do kilku tabel!

Według mojej wiedzy (sprawdzone na kilku bazach) nie ma konieczności zgodności nazw. Oczywiście typy pól (również rozmiar) zgodne być muszą.

Z samego zapytania trudno wywnioskować czy ta zgodność jest zachowana. Jeżeli tak - nie ma przeszkód przed takim rozbudowanym "unionem".Ryszard Lewandowski edytował(a) ten post dnia 31.01.08 o godzinie 20:49
Adam Aniołek

Adam Aniołek inż informatyk
specjalność systemy
informatyczne w
zarząd...

Temat: Jedno zapytanie do kilku tabel!

A czy istnieje inny sposób na realizację tego zadania? Chodzi o to, że należy sprawdzić czy w tych tabelach występuje w kolumnie F_ldz wartość odpowiadająca wartości T_pismo.id_pisma.Jeśli tak to zwracamy te np. id weirszy.
Bartosz Ratajczyk

Bartosz Ratajczyk MS SQL Developer

Temat: Jedno zapytanie do kilku tabel!

Adam Aniołek:
2. No nie bardzo z tymi samymi nazwami kolumn bo potem jest problem z wyświetleniem danych na stronie, powtarzające się nazwy powodują wyświetlenie pierwszych pasujących wyników a nie wszystkich? Stosuję Union ponieważ inaczej mi nie przeszukuje w ogóle tabel, tylko pierwszą.

UNION zwraca pojedyncze rekordy jeśli występują duble. Jeśli chcesz wszystkie rekordy stosujesz UNION ALL
czy w tych tabelach występuje w kolumnie F_ldz wartość odpowiadająca wartości T_pismo.id_pisma.Jeśli tak to zwracamy te np. id weirszy.

A to nie wystarczy jakiś INNER JOIN?
Adam Aniołek

Adam Aniołek inż informatyk
specjalność systemy
informatyczne w
zarząd...

Temat: Jedno zapytanie do kilku tabel!

Bartosz Ratajczyk:
Adam Aniołek:
czy w tych tabelach występuje w kolumnie F_ldz wartość odpowiadająca wartości T_pismo.id_pisma.Jeśli tak to zwracamy te np. id weirszy.

A to nie wystarczy jakiś INNER JOIN?
nie bo Inner Join zwraca wyniki nie takie jak ja potrzebuję. poprostu łączy wszystko z wszystkim. czyli jak mam kilka wierszy w jednej i np jeden w drugiej to mi nie wyświetli sumy tylko połączy jakoś inaczej że będę miał dużo więcej wyników i dotego błędnych.
Jacek Ołowiak

Jacek Ołowiak kierownik zespołu IT

Temat: Jedno zapytanie do kilku tabel!

left outer join

konto usunięte

Temat: Jedno zapytanie do kilku tabel!

Adam Aniołek:
A czy istnieje inny sposób na realizację tego zadania? Chodzi o to, że należy sprawdzić czy w tych tabelach występuje w kolumnie F_ldz wartość odpowiadająca wartości T_pismo.id_pisma.Jeśli tak to zwracamy te np. id weirszy.

ja bym to zrobiła jakoś tak:

select id_wiersza, "tabela1" as nazwa_tabeli from tabela1 where F_ldz in (select id_pisma from T_pismo where ldz='".$temp[0]."' and rok='".$temp[1]."')
union
select id_wirsza, "tabela2" as nazwa_tabeli from tabela2 where F_ldz in (select id_pisma from T_pismo where ldz='".$temp[0]."' and rok='".$temp[1]."')
union
itd..
nie chciało mi się dokładnie zagłębiać w nazwy tabel i kolumn;
pozdrawiam!
Adam Aniołek

Adam Aniołek inż informatyk
specjalność systemy
informatyczne w
zarząd...

Temat: Jedno zapytanie do kilku tabel!

Niestety ale dalej źle wyświetla wyniki. Dobra będę musiał zrobić to jako osobne zapytanie. Dzięki wszystkim za zainteresowanie.
Bartłomiej Bąk

Bartłomiej Bąk Software Developer,
dweorh's solutions
Bartłomiej Bąk,
Wr...

Temat: Jedno zapytanie do kilku tabel!

prosciej bedzie jak podasz plik generujacy odpowiednie tabele, dodajacy odpowiednie wpisy do tych tabel, dane wejsciowe i oczekiwane dane wyjsciowe. inaczej wszyscy beda krazyc jak we mgle...

konto usunięte

Temat: Jedno zapytanie do kilku tabel!

Bartłomiej Bąk:
prosciej bedzie jak podasz plik generujacy odpowiednie tabele, dodajacy odpowiednie wpisy do tych tabel, dane wejsciowe i oczekiwane dane wyjsciowe. inaczej wszyscy beda krazyc jak we mgle...

Dokładnie, trudno jest zaproponować dobre rozwiązanie wiedząc tylko tyle jakie jest złe...

konto usunięte

Temat: Jedno zapytanie do kilku tabel!

Jestes pewien? Wydaje mi sie, ze jezeli chodzi o 'uniony' to wystarczy zgodnosc ilosci kolumn oraz ich typow. Nazwy nie maja znaczenia, przejmowane sa w tabeli wynikowej z pierwszego selecta. Chyba, ze zle Cie zrozumialem...

Więc spróbuj zrobić selecta z takiego uniona innego niż "select *" :)

konto usunięte

Temat: Jedno zapytanie do kilku tabel!

Krzysztof P.:
Jestes pewien? Wydaje mi sie, ze jezeli chodzi o 'uniony' to wystarczy zgodnosc ilosci kolumn oraz ich typow. Nazwy nie maja znaczenia, przejmowane sa w tabeli wynikowej z pierwszego selecta. Chyba, ze zle Cie zrozumialem...

Więc spróbuj zrobić selecta z takiego uniona innego niż "select *" :)

SQL> select sysdate NIE from dual
2 union
3 select sysdate MASZ from dual
4 union
5 select sysdate RACJI from dual;

NIE
--------
08/02/03

konto usunięte

Temat: Jedno zapytanie do kilku tabel!

Dominik Z.:
Krzysztof P.:
Jestes pewien? Wydaje mi sie, ze jezeli chodzi o 'uniony' to wystarczy zgodnosc ilosci kolumn oraz ich typow. Nazwy nie maja znaczenia, przejmowane sa w tabeli wynikowej z pierwszego selecta. Chyba, ze zle Cie zrozumialem...

Więc spróbuj zrobić selecta z takiego uniona innego niż "select *" :)

NIE
--------
08/02/03

Piotr B. ma rację. Wystarczy zgodność typów i kolejność. Nazwy są brane z pierwszej części unii.
A przynajmniej na pewno tak jest w Sybase ASE 11.Piotr Likus edytował(a) ten post dnia 04.02.08 o godzinie 00:59

konto usunięte

Temat: Jedno zapytanie do kilku tabel!

Piotr Likus:
Dominik Z.:
Krzysztof P.:
Jestes pewien? Wydaje mi sie, ze jezeli chodzi o 'uniony' to wystarczy zgodnosc ilosci kolumn oraz ich typow. Nazwy nie maja znaczenia, przejmowane sa w tabeli wynikowej z pierwszego selecta. Chyba, ze zle Cie zrozumialem...

Więc spróbuj zrobić selecta z takiego uniona innego niż "select *" :)

NIE
--------
08/02/03

Piotr B. ma rację. Wystarczy zgodność typów i kolejność. Nazwy są brane z pierwszej części unii.
A przynajmniej na pewno tak jest w Sybase ASE 11.

ale czemu mi odpowiadasz, przecież to skryptem potwierdziłem :)

konto usunięte

Temat: Jedno zapytanie do kilku tabel!

Dominik Z.:
ale czemu mi odpowiadasz, przecież to skryptem potwierdziłem :)

Drobny problem z formatowaniem wiadomości :)

Następna dyskusja:

dwie tabele jedno zapytanie...




Wyślij zaproszenie do