Diskuze: Multiple join ze stejné tabulky podruhé

Ostatní jazyky SQL SQL a databáze Multiple join ze stejné tabulky podruhé

Avatar
petr.chatar.anton:

Zdravím všechny,
pokouším se sestavit podobný dotaz jako zde:

http://www.itnetwork.cz/…5b7cf0fd87d4

Použil jsem řešení, které poslal MrPabloz. Problém ale je, že v první tabulce (u mně je to tabulka cesty1) nemusí být vyplněny oba záznamy (u mně zakazka1 a zakazka2). Tento dotaz ale vrací jen ty řádky z CP, kde jsou vyplněny obě hodnoty zakazka1 a zakazka2. Já potřebuji vrátit všechny řádky.

Tohle je tabulka cesty1

cislo zakazka1 zakazka2
1500101472 9321  
1526100156 3701 3600.40

Tohle je tabulka O8AZ2015

cislo_zakazky referent
3600.40 00105
3701 01683
9321 00912

Dotaz mám takto:

select cislo, zakazka1, zakazka2, prvniZakazka.referent, druhaZakazka.referent
from CESTY1, (select * from O8AZ2015) as prvniZakazka, (select * from O8AZ2015) as druhaZakazka
where cesty1.zakazka1 = prvniZakazka.cislo_zakazky and cesty1.zakazka2 = druhaZakazka.cislo_zakazky
order by cislo
 
Odpovědět  -1 24.9.2015 16:13
Avatar
MrPabloz
Člen
Avatar
Odpovídá na petr.chatar.anton
MrPabloz:

Na tohle je lepší než WHERE udělat JOIN.

SELECT cesty1.cislo, cesty1.zakazka1, cesty1.zakazka2, prvnizakazka.referent, druhazakazka.referent
FROM CESTY1 as cesty1
INNER JOIN OBAZ2015 as prvnizakazka ON cesty1.cislo = prvnizakazka.cislo_zakazky
INNER JOIN OBAZ2015 as druhazakazka ON cesty1.cislo = druhazakazka.cislo_zakazky
ORDER BY cesty1.cislo
Nahoru Odpovědět 24.9.2015 18:09
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
Odpovídá na petr.chatar.anton
Michal Štěpánek:

Jak psal kolega, použij JOIN. Jen pokud některá data nemusí být v tabulce, je třeba použít "OUTER JOIN", buď RIGHT OUTER JOIN nebo LEFT OUTER JOIN podle toho v které tabulce můžou být nevyplněné hodnoty...

Nahoru Odpovědět 24.9.2015 21:37
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
MrPabloz
Člen
Avatar
Odpovídá na Michal Štěpánek
MrPabloz:

Pravda, spletl jsem si JOIN, nemá to být INNER JOIN ale OUTER.
V tvém případě to bude LEFT JOIN pouze, protože chceš všechny hodnoty z tabulky CESTY1 a k tomu všechny z ostatních ale zároveň pro neexistujicí přesto vložit tu z CESTY1.
Výsledný dotaz tedy bude:

SELECT cesty1.cislo, cesty1.zakazka1, cesty1.zakazka2, prvnizakazka.referent, druhazakazka.referent
FROM CESTY1 as cesty1
LEFT JOIN OBAZ2015 as prvnizakazka ON cesty1.cislo = prvnizakazka.cislo_zakazky
LEFT JOIN OBAZ2015 as druhazakazka ON cesty1.cislo = druhazakazka.cislo_zakazky
ORDER BY cesty1.cislo
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 24.9.2015 22:00
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
MrPabloz
Člen
Avatar
Odpovídá na MrPabloz
MrPabloz:

No Nevím proč mi to nejde editovat, samozřejmě Odpovědět mělo být na první příspěvek. tudíž se omlouvám za omyl :)

Nahoru Odpovědět 24.9.2015 22:01
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
Odpovídá na MrPabloz
petr.chatar.anton:

Ahoj, vyzkoušel jsem, ale dostávám špatný výsledky. Hodnota referent je u všech záznamů NULL. Vyzkoušel jsem pro jednoduchost pouze spojení na zakazka1, výsledek je stejný. Přitom data mám snad v pořádku.

 
Nahoru Odpovědět 25.9.2015 9:45
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na petr.chatar.anton
patrik.valkovic:

Zkus místo "prvniZakazka­.referant" napsat celou cestu "08AZ2015.refe­rant".

Nahoru Odpovědět 25.9.2015 9:52
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Odpovídá na patrik.valkovic
petr.chatar.anton:

To už jsem zkusil taky, zrušil jsem ty ASy :-), má m to takhle:

SELECT cesty1.cislo, cesty1.zakazka1, cesty1.zakazka2, O8AZ2015.referent
FROM Orsoft.dbo.CESTY1
left join Orsoft.dbo.O8AZ2015 on cislo = O8AZ2015.cislo_zakazky
order by cesty1.cislo

Výsledek je ale stejnej.

 
Nahoru Odpovědět 25.9.2015 9:55
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na petr.chatar.anton
patrik.valkovic:

Jak se tak dívám na schéma - spojuješ to přes sloupec cislo, nebo přes sloupec *zakazka1", eventuelně "zakazka2"? Protože dotaz spojuje přes číslo, ale tam jsou nějaké bláznivé cifry. Spíš to vypadá, že to chceš spojit přes zakázky. Ale budeš mít problém s tím, že máš dva sloupce pro zakázku - budeš muset vybírat ze dvou. Nebylo by jednodušší, pro to vyvořit vlastní tabulku? Nevím, jaký máš návrh zbytku databáze a programu.

Nahoru Odpovědět  +1 25.9.2015 10:00
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Odpovídá na patrik.valkovic
petr.chatar.anton:

Jasně !!!!
Opsal jsem ten dotaz z odpovědi od MrPabloz a toho spojení sem si vůbec nevšiml. Správně tedy ten dotaz je:

SELECT CESTY1.cislo, cesty1.zakazka1, cesty1.zakazka2, prvnizakazka.referent, druhazakazka.referent
FROM CESTY1 as cesty1
LEFT JOIN O8AZ2015 as prvnizakazka ON cesty1.zakazka1 = prvnizakazka.cislo_zakazky
LEFT JOIN O8AZ2015 as druhazakazka ON cesty1.zakazka2 = druhazakazka.cislo_zakazky
ORDER BY cesty1.cislo
 
Nahoru Odpovědět 25.9.2015 10:07
Avatar
petr.chatar.anton:

Děkuju Vám moc !!!

 
Nahoru Odpovědět 25.9.2015 10:08
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.