[mysql] Zapytanie do dwóch tabel i dziwny wynik
Boguslaw Olszewski - 13-11-2006 00:16
[mysql] Zapytanie do dwóch tabel i dziwny wynik
Witam, Męczę się nad warunkami, cały czas coś nie tak i już wiem dla czego. No właśnie dlaczego poniższe zapytanie do dwóch tabel w przypadku gdy jedna z tabel jest pusta nie daje rezultatu w postaci rekordów z drugiej tabeli:
select * from tabela1, tabela2;
Oczywiście gdy obie tabele zawierają rekordy zapytanie daje poprawny rezultat. B.O.
JT - 13-11-2006 00:16
Boguslaw Olszewski napisał(a): > Witam, > Męczę się nad warunkami, cały czas coś nie tak i już wiem dlaczego. No > właśnie dlaczego poniższe zapytanie do dwóch tabel w przypadku gdy jedna > z tabel jest pusta nie daje rezultatu w postaci rekordów z drugiej tabeli: > > select * from tabela1, tabela2; > > Oczywiście gdy obie tabele zawierają rekordy zapytanie daje poprawny > rezultat.
I słusznie. Takie zapytanie zwraca Ci iloczyn (kartezjański?) dwóch tablic. Jak jedna nie ma rekordów, to wynikiem mnożenia jest zawsze zero (tu: zbiór pusty). :)
Trudno wywnioskować, czego oczekiwałeś po zapytaniu. Może napisz, co dokładnie chciałeś osiągnąć. Może powinieneś zainteresować się UNION?
JT
Shalom - 13-11-2006 00:16
INNER JOIN cos takiego.
Shalom - 13-11-2006 00:16
LEFT oczywiscie
bogunio - 13-11-2006 00:16
JT napisał(a): > Boguslaw Olszewski napisał(a): >> Witam, >> Męczę się nad warunkami, cały czas coś nie tak i już wiem dla czego. No >> właśnie dlaczego poniższe zapytanie do dwóch tabel w przypadku gdy jedna >> z tabel jest pusta nie daje rezultatu w postaci rekordów z drugiej tabeli: >> >> select * from tabela1, tabela2; >> >> Oczywiście gdy obie tabele zawierają rekordy zapytanie daje poprawny >> rezultat. > > I słusznie. Takie zapytanie zwraca Ci iloczyn (kartezjański?) dwóch > tablic. Jak jedna nie ma rekordów, to wynikiem mnożenia jest zawsze > zero (tu: zbiór pusty). :) > > Trudno wywnioskować, czego oczekiwałeś po zapytaniu. Może napisz, > co dokładnie chciałeś osiągnąć. Może powinieneś zainteresować > się UNION? >
Już wyjaśniam. Mam bazę rejestrującą sprzedaż, w uproszczeniu jest tam nazwa artykułu i data. Potem, na podstawie daty, wyciągam rejestr sprzedaży za dany dzień, nadaje mu numer i jest to jakiś dokument - dowód wewnętrzny. Problem polega na tym, że sprzedaż dokonywana jest z jednego stanowiska "a konto" dwóch firm i na koniec miesiąca ktoś decyduje której firmie przypisać sprzedaż z danego dnia. Czyli: - A - tabela: sprzedaż, data - B - tabela: numer dokumentu, firma1, data - C - tabela: numer dokumentu, firma2, data. No i wymyśliłem sobie, że trzeba wykluczyć wystawienie dowodu wewnętrznego na firmę2 gdy już taki dowód jest wystawiony (ta sama data) dla firmy1. Czyli, jeżeli zapytanie w stylu:
select * from tabela1 as t1, tabela2 as t2 where t1.data=żądana_data or t2.data=żądana data;
da wynik, to znaczy, że dublujemy dokument sprzedaży dla np. firmy1 bo jest wystawiony już dla firmy2. No ale tak jak piszesz, skoro chodzi o iloczyn to gdy w tabela z B jest pusta to pomimo wystąpienia w tabeli C dokumentu z daną datą jest ciągle możliwość przy tak postawionym warunku wystawić dokument w tabeli B, dla firmy1 z taką samą datą. Jak to napisać poprawnie? B.O.
bart - 13-11-2006 00:18
Shalom napisal(a): > INNER JOIN cos takiego.
bujasz kolego... cos chyba slyszales o JOIN-ach, ale nie wiesz do czego to sluzy...
b.
bart - 13-11-2006 00:18
bogunio napisał(a): > JT napisał(a): > > Boguslaw Olszewski napisał(a): > >> Witam, > >> Męczę się nad warunkami, cały czas coś nie tak i już wiem dla czego. No > >> właśnie dlaczego poniższe zapytanie do dwóch tabel w przypadkugdy jedna > >> z tabel jest pusta nie daje rezultatu w postaci rekordów z drugiej tabeli: > >> > >> select * from tabela1, tabela2; > >> > >> Oczywiście gdy obie tabele zawierają rekordy zapytanie daje poprawny > >> rezultat. > > > > I słusznie. Takie zapytanie zwraca Ci iloczyn (kartezjański?) dwóch > > tablic. Jak jedna nie ma rekordów, to wynikiem mnożenia jest zawsze > > zero (tu: zbiór pusty). :) > > > > Trudno wywnioskować, czego oczekiwałeś po zapytaniu. Może napisz, > > co dokładnie chciałeś osiągnąć. Może powinieneś zainteresować > > się UNION? > > > > Już wyjaśniam. Mam bazę rejestrującą sprzedaż, w uproszczeniujest tam > nazwa artykułu i data. Potem, na podstawie daty, wyciągam rejestr sprzedaży > za dany dzień, nadaje mu numer i jest to jakiś dokument - dowód > wewnętrzny. Problem polega na tym, że sprzedaż dokonywana jest z jednego > stanowiska "a konto" dwóch firm i na koniec miesiąca ktoś decyduje > której firmie przypisać sprzedaż z danego dnia. Czyli: > - A - tabela: sprzedaż, data > - B - tabela: numer dokumentu, firma1, data > - C - tabela: numer dokumentu, firma2, data. > No i wymyśliłem sobie, że trzeba wykluczyć wystawienie dowodu > wewnętrznego na firmę2 gdy już taki dowód jest wystawiony (ta sama data) > dla firmy1. Czyli, jeżeli zapytanie w stylu: > > select * from tabela1 as t1, tabela2 as t2 where t1.data=żądana_data or > t2.data=żądana data; > > da wynik, to znaczy, że dublujemy dokument sprzedaży dla np. firmy1 bo > jest wystawiony już dla firmy2. No ale tak jak piszesz, skoro chodzi o > iloczyn to gdy w tabela z B jest pusta to pomimo wystąpienia w tabeli C > dokumentu z daną datą jest ciągle możliwość przy tak postawionym warunku > wystawić dokument w tabeli B, dla firmy1 z taką samą datą. > Jak to napisać poprawnie? > B.O.
szukaj o LEFT OUTER JOIN. nie wczytywalem sie w twoj post dokladnie, ale chyba ci chodzi o cos takiego: select A.cos_tam, B.cos_tam, C.cos_tam FROM A LEFT OUTER JOIN B ON A.data=B.data LEFT OUTER JOIN C ON A.data=C.data.
byc moze moglbys zadziałac jeszcze sprytniej i poczatek zapisac poprzez select A.cos_tam, ifnull(B.cos_tam, C.cos_tam) FROM (i pozniej to samo)... ale to zalezy co chcesz zobaczyc na ekranie...
pozdrawiam, bartek.
bogunio - 13-11-2006 00:43
bart napisał(a): > bogunio napisał(a): >> JT napisał(a): >>> Boguslaw Olszewski napisał(a): >>>> Witam, >>>> Męczę się nad warunkami, cały czas coś nie tak i już wiem dla czego. No >>>> właśnie dlaczego poniższe zapytanie do dwóch tabel w przypadku gdy jedna >>>> z tabel jest pusta nie daje rezultatu w postaci rekordów z drugiej tabeli: >>>> >>>> select * from tabela1, tabela2; >>>> >>>> Oczywiście gdy obie tabele zawierają rekordy zapytanie daje poprawny >>>> rezultat. >>> I słusznie. Takie zapytanie zwraca Ci iloczyn (kartezjański?) dwóch >>> tablic. Jak jedna nie ma rekordów, to wynikiem mnożenia jest zawsze >>> zero (tu: zbiór pusty). :) >>> >>> Trudno wywnioskować, czego oczekiwałeś po zapytaniu. Może napisz, >>> co dokładnie chciałeś osiągnąć. Może powinieneś zainteresować >>> się UNION? >>> >> Już wyjaśniam. Mam bazę rejestrującą sprzedaż, w uproszczeniu jest tam >> nazwa artykułu i data. Potem, na podstawie daty, wyciągam rejestr sprzedaży >> za dany dzień, nadaje mu numer i jest to jakiś dokument - dowód >> wewnętrzny. Problem polega na tym, że sprzedaż dokonywana jest z jednego >> stanowiska "a konto" dwóch firm i na koniec miesiąca ktoś decyduje >> której firmie przypisać sprzedaż z danego dnia. Czyli: >> - A - tabela: sprzedaż, data >> - B - tabela: numer dokumentu, firma1, data >> - C - tabela: numer dokumentu, firma2, data. >> No i wymyśliłem sobie, że trzeba wykluczyć wystawienie dowodu >> wewnętrznego na firmę2 gdy już taki dowód jest wystawiony (ta sama data) >> dla firmy1. Czyli, jeżeli zapytanie w stylu: >> >> select * from tabela1 as t1, tabela2 as t2 where t1.data=żądana_data or >> t2.data=żądana data; >> >> da wynik, to znaczy, że dublujemy dokument sprzedaży dla np. firmy1 bo >> jest wystawiony już dla firmy2. No ale tak jak piszesz, skoro chodzi o >> iloczyn to gdy w tabela z B jest pusta to pomimo wystąpienia w tabeli C >> dokumentu z daną datą jest ciągle możliwość przy tak postawionym warunku >> wystawić dokument w tabeli B, dla firmy1 z taką samą datą. >> Jak to napisać poprawnie? >> B.O. > > szukaj o LEFT OUTER JOIN. > nie wczytywalem sie w twoj post dokladnie, ale chyba ci chodzi o cos > takiego: > select A.cos_tam, B.cos_tam, C.cos_tam FROM A LEFT OUTER JOIN B ON > A.data=B.data LEFT OUTER JOIN C ON A.data=C.data. > > byc moze moglbys zadziałac jeszcze sprytniej i poczatek zapisac > poprzez > select A.cos_tam, ifnull(B.cos_tam, C.cos_tam) FROM (i pozniej to > samo)... > ale to zalezy co chcesz zobaczyc na ekranie... > > pozdrawiam, bartek. > Dzięki za odpowiedź. Pójdę Twoim tropem. pozdro, b.o.
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[mysql] =?ISO-8859-2?Q?Za=E6mienie=2E=2E=2E_jak_wy=B6wietli=E6?==?ISO-8859-2?Q?=2E=2E=2E?=
[MySQL] =?ISO-8859-2?Q?Wy=B6wietlenie_kolejnej_pozycji=2C_?==?ISO-8859-2?Q?jak=B1_mia=B3by_dany_rekord=2C_gdybym_czyta=B3 _?==?ISO-8859-2?Q?wg_konkretnych_kryteri=F3w=2E_Da_si=EA_=3F?=
[mysql 4.0.x] przenoszenie kolum =?ISO-8859-2?Q?mi=EAdzy_bazam?==?ISO-8859-2?Q?i_cd_=2E=2E=2E_?=
[MySQL] =?ISO-8859-2?Q?z=B3=B1czenie_tabeli_u=BFytkownik_i?==?ISO-8859-2?Q?_zdj=EAcia_z_wyborem_zdj=EAcia_domy=B6lnego?=
[MySQL] Jak =?ISO-8859-2?Q?wpisa=E6_do_tabeli_pozycje_dl?==?ISO-8859-2?Q?a_wierszy_gdybym_te_wiersze_wybiera=B3_w_ok?== ?ISO-8859-2?Q?re=B6lonej_kolejno=B6ci_=3F?=
Gdzie MySQL 4.1, a gdzie 5.0?
[MySQL 4.0...4.1] zabezpieczenie przed =?ISO-8859-2?Q?jednoczesn?==?ISO-8859-2?Q?=B1_edycj=B1?=
[MS SQL] "set names" (mySQL) w MS SQL
MySQL - jak =?ISO-8859-2?Q?wyeksportowa=E6_zawarto=B6=E6_wie?==?ISO-8859-2?Q?lkiej_tabeli?=
[MySQL] Czy da =?ISO-8859-2?Q?si=EA_wykonac_takie_powi=B1z?==?ISO-8859-2?Q?anie_mi=EAdzy_tabelami=2C_i_jak_to_odpyta=E6_? ==?ISO-8859-2?Q?=3F?=
zanotowane.pldoc.pisz.plpdf.pisz.pllisinski.htw.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|