[mysql] JOIN
Proton - 11-11-2005 11:41
[mysql] JOIN
Czesc,
przyznam sie ze teraz pisze z lenistwa ;-),
Zalozenia: 1. dwie tabele a. pozycje do dokumentu produkcyjnego b. receptury wyrobow 2. W receptuze np. na produkcje stolka jest 5 elementow o id 1,2,3,4,5 3. ktos na dokumencie wpisal 5 pozycji o id 3,4,5,6,7 4. te id to identyfikatory surowcow z trzeciej tabeli 5. elementem wspolnym jest id_wyrobu np 100
Pytanie : jaki JOIN ew. bardziej rozbudowane zapytanie zeby w wyniku uzyskac wszystkie 7 wierszy czyli pozycje z obydwoch tabel o id 1,2,3,4,5,6,7
moze banalne ale juz mam juz na dzisiaj dosc kombinowania wiec moze ktos sie zlituje i podpowie ?? -- pozdro Proton
fasol - 11-11-2005 11:41
> przyznam sie ze teraz pisze z lenistwa ;-), > > Zalozenia: > 1. dwie tabele > a. pozycje do dokumentu produkcyjnego > b. receptury wyrobow > 2. W receptuze np. na produkcje stolka jest 5 elementow o id 1,2,3,4,5 > 3. ktos na dokumencie wpisal 5 pozycji o id 3,4,5,6,7 > 4. te id to identyfikatory surowcow z trzeciej tabeli > 5. elementem wspolnym jest id_wyrobu np 100 > > Pytanie : > jaki JOIN ew. bardziej rozbudowane zapytanie zeby w wyniku uzyskac wszystkie > 7 wierszy czyli pozycje z obydwoch tabel o id 1,2,3,4,5,6,7 > > moze banalne ale juz mam juz na dzisiaj dosc kombinowania wiec moze ktos sie > zlituje i podpowie ?? > --
select id_surowca from pozycje where id_wyrobu = 100 union select id_surowca from recepury where id_wyrobu = 100
Proton - 11-11-2005 11:41
Użytkownik "fasol" <solu@poczta.onet.pl> napisał w wiadomości news:dkv0vh$7gr$1@nemesis.news.tpi.pl... >> przyznam sie ze teraz pisze z lenistwa ;-), > select id_surowca from pozycje > where id_wyrobu = 100 > union > select id_surowca from recepury > where id_wyrobu = 100 > >
Niestety to za proste bo wtedy wyswietli 10 wierszy - po 5 z kazdej tabeli a ja potrzebuje miec w wyniku 7 - 3 wspolne i po 2 pozostale Acha i jeszcze jedno: raport, ktory bedzie z tego korzystal jest, ze tak sie wyraze, baaaaardzo rozbudowany, ale oczywiscie reszte mam juz opracowana. W zwiazku z tym zalezy mi na jak najbardziej eleganckim (szybkim ?) rozwiazaniu. -- pozdro Proton
fasol - 11-11-2005 11:41
> > select id_surowca from pozycje > > where id_wyrobu = 100 > > union > > select id_surowca from recepury > > where id_wyrobu = 100 > > > > > > Niestety to za proste bo wtedy wyswietli 10 wierszy - po 5 z kazdej tabeli a > ja potrzebuje miec w wyniku 7 - 3 wspolne i po 2 pozostale > Acha i jeszcze jedno: > raport, ktory bedzie z tego korzystal jest, ze tak sie wyraze, baaaaardzo > rozbudowany, ale oczywiscie reszte mam juz opracowana. W zwiazku z tym > zalezy mi na jak najbardziej eleganckim (szybkim ?) rozwiazaniu. > --
Poniższa konstrukcja powinna zwrócić Ci wszystkie pozycje
select id_surowca from pozycje where id_wyrobu = 100 union all select id_surowca from recepury where id_wyrobu = 100
Natomiast użycie UNION nie powinno zawierać powtórzeń
Andrzej Dąbrowski - 11-11-2005 11:41
select DISTINCT id_surowca from 3 tabela where id_surowca in ( select id_surowca from pozycje where id_wyrobu = 100 union select id_surowca from recepury where id_wyrobu = 100)
Andrzej Dąbrowski
Proton - 11-11-2005 11:41
Użytkownik "Andrzej Dąbrowski" <andrzejd@sims.pl> napisał w wiadomości news:dkv4p1$avv$1@atlantis.news.tpi.pl... > > > > select DISTINCT id_surowca from 3 tabela where > id_surowca in ( > select id_surowca from pozycje > where id_wyrobu = 100 > union > select id_surowca from recepury > where id_wyrobu = 100) > > Andrzej Dąbrowski
niom - mysle, ze to o to mi chodzilo : sprawdze i dam znac W kazdym razie dzieki wszystkim :-) -- pozdro Proton
Proton - 11-01-2006 09:09
Użytkownik "Andrzej Dąbrowski" <andrzejd@sims.pl> napisał w wiadomości news:dkv4p1$avv$1@atlantis.news.tpi.pl... > > > > select DISTINCT id_surowca from 3 tabela where > id_surowca in ( > select id_surowca from pozycje > where id_wyrobu = 100 > union > select id_surowca from recepury > where id_wyrobu = 100)
posluzylem sie Twoja porada ale w troche inny sposob Stworzylem konstrukcje o nastepujacej budowie:
SELECT * FROM ( SELECT ..... FROM tab1 LEFT JOIN tab2 .... WHERE ...
UNION
SELECT ..... FROM tab3 LEFT JOIN tab2 .... WHERE ... ) LEFT JOIN .... WHERE ... GROUP BY ..... WITH ROLLUP
Czyli UNION wrzucilem do klauzuli FROM zapytania glownego i pieknie to dziala. Jezeli ktos jest zainteresowany to moge wkleic pelny kod z analiza i objasnieniami. Tak przy okazji okazalo sie, ze taka konstrukcja jest najszybsza z tych, ktore probowalem wdrozyc, mimo ze ostatecznie zawiera sporo kodu i dziala na sporej liczbie danych. I dodatkowo daje duze mozliwosci w kwestii operowania na tych danych - rozne wersje podsumowan, grupowania danych itp. -- pozdrawiam Proton
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?wielko=B6=E6_bazy_a_stabilno=B6=E6=2C?==?ISO-8859-2?Q?_podzia=B3_du=BFej_bazy_a_powi=B1zania_tabel?=
[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 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
zanotowane.pldoc.pisz.plpdf.pisz.plmorebeer.opx.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 |
|