Portál AbcLinuxu, 9. května 2025 03:28

Dotaz: SQL dotaz - 2 tabulky

20.3.2013 21:37 Petr
SQL dotaz - 2 tabulky
Přečteno: 1018×
Odpovědět | Admin
potřebuji poradit, lze nějak vytvořit takový SQL dotaz? Mám MySQL tabulky TAB1(Rec Long primary key, Typ int) a TAB2(Rec Long, Krok varchar(5), Datum date) a potřebuji vypsat Rec z TAB1, kde Typ = např. 1 a v TAB2 je s tímto Rec Krok 'KrokA' a zároveň není žádný Krok 'KrokB' s datem větším než u 'KrokA'. Snad je to srozumitelné. Děkuji za pomoc.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

20.3.2013 22:41 kuka
Rozbalit Rozbalit vše Re: SQL dotaz - 2 tabulky
Odpovědět | | Sbalit | Link | Blokovat | Admin
Spojeni TAB1 s TAB2 s podminkou na KrokA by melo byt trivialni, nasledne ... and not exists (dotaz na KrokB podle kriterii) a podle moznosti duplicity KrokA pak pripadne jeste distinct.
20.3.2013 23:32 Petr
Rozbalit Rozbalit vše Re: SQL dotaz - 2 tabulky
ano, s podmínkou jen na 'KrokA' bych udělal SELECT DISTINCT TAB1.Rec FROM TAB1,TAB2 WHERE TAB1.Rec=TAB2.Rec AND Krok = 'KrokA'; Ale jak tam dodat podmínku na nepřitomnost 'KrokB' a ještě jen s datem větším než u toho nalezeného 'KrokA' (A to ještě teoreticky by pro jeden Rec mohlo záznamů kde Krok = 'KrokA' být i více a v tom případě by mě zajímal ten poslední (s nejvyšším datem) a testovat nepřítomnost 'KrokB' po tomto datu), to nevím ...
21.3.2013 08:26 j
Rozbalit Rozbalit vše Re: SQL dotaz - 2 tabulky
na prasaka (nezarucuju syntax):

select * (

select * from tab1
 join (select rec, max(datum) from tab2 where krok = "kroka") as s1
    on tab1.rec = s2.rec
 join (select rec, max(datum) from tab2 where krok = "krokb") as s2
    on tab1.rec = s2.rec
)

where s1.datum > s2.datum

21.3.2013 08:30 j
Rozbalit Rozbalit vše Re: SQL dotaz - 2 tabulky
a jasne, uz tam vidim min jeden bug ... prvni join ma byt na s1 samo ...
21.3.2013 09:18 kuka
Rozbalit Rozbalit vše Re: SQL dotaz - 2 tabulky
No prida se tam and not exists (select vybirajici KrokB s vyssim datumem). Jestli chces maximalni datum, tak nakonec neudelas distinct, ale group by. Pokud tyto konstrukce neznas (exists, group by), tak si je nekde dohledej, to jsou azklady SQL, bez kterych se daleko nedostanes. Vysledny dotaz bude de facto ten tvuj slovni pozadavek zapsany "anglicky".
21.3.2013 14:34 Petr
Rozbalit Rozbalit vše Re: SQL dotaz - 2 tabulky
Základy SQL znám, ale v tomto případě prostě nevím. Mohl byste mi prosím napsat celý SQL dotaz?
21.3.2013 15:50 kuka
Rozbalit Rozbalit vše Re: SQL dotaz - 2 tabulky
Tak treba
select t1.rec, max(krok_a.datum)
from t1, t2 krok_a
where t1.rec = krok_a.rec
  and krok_a.krok = 'KrokA'
  and not exists( select 0 from t2 krok_b
                    where krok_b.rec = t1.rec
                      and krok_b.krok = 'KrokB'
                      and krok_b.datum > krok_a.datum)
group by t1.rec
konkretne toto lze udelat jednoduchym group by jen nad tabulkou t2, coz doporucuju jako cviceni.
21.3.2013 08:12 Tomáš
Rozbalit Rozbalit vše Re: SQL dotaz - 2 tabulky
Odpovědět | | Sbalit | Link | Blokovat | Admin

Asi tak nějak (čistě syntaktický přepis Vašeho zadání):

select t1.Rec
from TAB1 as t1
join TAB2 as t2 
  on t1.Rec=t2.Rec and t.Krok='KrokA' and t1.Typ=1
left join ( 
  select Rec,min(Datum) as dt
  from TAB2
  where Krok='KrokB'
  group by Rec
) as t3
 on t2.Rec=t3.Rec and t2.Datum < t3.dt 
where t3.Rec is null  

Kdyby jste uvedl co je v TAB2 (primárním) klíčem, tak to možná šlo ještě jednodušeji ( jedna agregace plus jeden join ).

21.3.2013 10:35 Petr
Rozbalit Rozbalit vše Re: SQL dotaz - 2 tabulky
Děkuji, tohle vypadá nadějně, ale potřebuji z TAB2 najít poslední (s nejvyšším datem) záznam, kde Krok = 'KrokA' a pak už po něm není žádný záznam 'KrokB'
21.3.2013 21:19 Tomáš
Rozbalit Rozbalit vše Re: SQL dotaz - 2 tabulky

Zase jen syntaktický přepis (bez jakékoliv znalosti skutečného problému)

select
  Rec
  ,max(case when Krok='KrokA' then Date else null end ) -- poslední datum pro KrokA
from TAB2
group by Rec
having  
  max( case when Krok='KrokA' then Date else null end )  -- nejvyssi datum pro KrokA ( = poslední)
  > -- je větší než
  max( case when Krok='KrokB' then Date else null end )  -- nejvyšší datum pro KrokB
21.3.2013 21:33 Tomáš
Rozbalit Rozbalit vše Re: SQL dotaz - 2 tabulky

Ještě jsem zapoměl na dva okrajové případy, kdy jeden z kroků není k dispozici

select
  Rec
  ,max(case when Krok='KrokA' then Date else null end ) -- poslední datum pro KrokA
from TAB2
group by Rec
having
  max( case when Krok='KrokA' then Date else null end ) is not null -- existuje krokA
 and -- a zároveň
  (
     max( case when Krok='KrokA' then Date else null end )  -- nejvyssi datum pro KrokA ( = poslední)
     > -- je větší než
     max( case when Krok='KrokB' then Date else null end )  -- nejvyšší datum pro KrokB
  or -- nebo se krokB nedohledá
     max( case when Krok='KrokB' then Date else null end ) is NULL 
 
  )

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.