Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Multiple join ze stejné tabulky podruhé

Aktivity
Avatar
petr.chatar.anton:24.9.2015 16:13

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
24.9.2015 16:13
Avatar
MrPabloz
Člen
Avatar
Odpovídá na petr.chatar.anton
MrPabloz:24.9.2015 18:09

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:24.9.2015 21:37

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:24.9.2015 22:00

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í
+2,50 Kč
Ř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:24.9.2015 22:01

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:25.9.2015 9:45

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
Odpovídá na petr.chatar.anton
Patrik Valkovič:25.9.2015 9:52

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 Valkovič
petr.chatar.anton:25.9.2015 9:55

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
Odpovídá na petr.chatar.anton
Patrik Valkovič:25.9.2015 10:00

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
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 Valkovič
petr.chatar.anton:25.9.2015 10:07

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:25.9.2015 10:08

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.