Autor | Zpráva | ||
---|---|---|---|
Hitman Profil |
#1 · Zasláno: 20. 1. 2016, 21:37:26
Dobrý den,
mám asi jednoduchý dotaz, ale nějak nemůžu přijít jak na to. Mám tabulku zákazníci a objednávky. Páruje se to podle emailu. Potřebuji napsat dotaz kde se vypíší zákazníci (emaily) kteří jsou v tabulce zákazníci, ale nic neobjednali - nejsou v tabulce objednávky. Takže opak tohoto: SELECT email FROM zakaznici INNER JOIN objednavky ON zakaznici.email = objednavky.email Myslel jsem že to půjde přes některý jiný JOIN, ale nikoliv. LEFT mi vypíše samozdřejmě všechny ze zákazníků a RIGHT udělá to samé co INNER. Případně mě ještě napadlo udělat něco jako (SELECT... LEFT JOIN...) mínus (SELECT...INNER JOIN) a byli by tam také ti co potřebuju. Díky |
||
lionel messi Profil |
Hitman:
Mohlo by pomôcť: SELECT z.email FROM zakaznici z LEFT OUTER JOIN objednavky o ON z.email = o.email WHERE o.email IS NULL Upravené. |
||
Hitman Profil |
Aha, takhle.
Píše mi to ještě: Column 'email' in field list is ambiguous. Pokud zápis tedy specifikuji jako "SELECT zakaznici.email" tak mi to zase píše "Unknown column 'zakaznici.email' in 'field list' "... // Pokud tam dám hvězdičku tak to funguje a vypíše se mi email, jméno, příjmení. Proč tedy není možné vypsat jen ten sloupec email, když ve výpisu evidentně je? Každopádně díky PS: Ještě jeden dotaz - pokud použiji LEFT JOIN, bere se to jako "LEFT INNER JOIN"? |
||
anonymníí Profil * |
#4 · Zasláno: 21. 1. 2016, 15:53:15
Hitman:
No, a nemělo by tam tedy být z.email , když už má tabulka alias přidělený? Jiné logické vysvětlení té chybové hlášky mě nenapadá, evidentně tam ten email existuje (pokud tam nemáš překlep, typicky mail a email ...
|
||
juriad Profil |
#5 · Zasláno: 21. 1. 2016, 15:57:55
Hitman:
LEFT JOIN je to samé jako LEFT OUTER JOIN; LEFT INNER JOIN neexistuje. INNER JOIN je to samé jako pouhý JOIN, žádný další přívlastek už mít nemůže. |
||
Hitman Profil |
Aha, díky. Myslel jsem že i když má tabulka alias, používat se nemusí. A také jsem si myslel že se alias přiděluje až o několik znáků dále, nevěděl jsem jak pracuje překladač.
Takže díky za info, příspěvek od messiho už je upravený. A ještě mi dovolte jeden dotaz, chci mazat ve dvou tabulkách, vše kde je id_akce 4: DELETE rozpis_akci, listky FROM rozpis_akci, listky INNER JOIN listky.id_akce = rozpis_akci.id_akce WHERE listky.id_akce = 4; Ale hlásí mi to: Not unique table/alias: 'rozpis_akci' Jak tomu mám rozumět? Tabulku "rozpis_akci" mám jen jednu. |
||
lionel messi Profil |
Hitman:
Celý DELETE dotaz máš akýsi pomiešaný (konkrétne pasáž s JOIN-om): DELETE r_a, l FROM rozpis_akci r_a INNER JOIN listky l ON l.id_akce = r_a.id_akce WHERE l.id_akce = 4; |
||
Keeehi Profil |
#8 · Zasláno: 21. 1. 2016, 17:31:30
Hitman:
DELETE rozpis_akci, listky FROM rozpis_akci INNER JOIN listky WHERE listky.id_akce = 4; |
||
Hitman Profil |
Aha, díky. A ještě (snad) poslední dotaz. Co pokud chci změnit v obou tabulkách kolonku email, která je primárním klíčem?
T1 - primární klíč email T2 - navázaná na T1 přes email Čili jsem si myslel že bude fungovat: UPDATE T1 , listky SET T1 .email = 'email222@email.cz'; INNER JOIN T2 ON T2 .email = T1 .email WHERE T1 .email = 'email@email.cz'; Ale píše mi to #1062 - Duplicate entry 'email222@email.cz' for key 'PRIMARY' , čemuž nerozumím, protože v tabulce T1 je momentálně email@email.cz, žádný email222@email.cz tam není. Nebo se na to musí jinak přes CASCADE? // Takto mi to funguje: SET foreign_key_checks = 0; UPDATE T1 SET email='email222' WHERE email='email' UPDATE T2 SET email='email2222' WHERE email='email'; SET foreign_key_checks = 1; Ale nevím jestli je to správné, řešit takto? |
||
nightfish Profil |
#10 · Zasláno: 21. 1. 2016, 20:36:42
Hitman:
„Co pokud chci změnit v obou tabulkách kolonku email, která je primárním klíčem?“ Jediné správné řešení je nepoužívat e-mail jako primární klíč. |
||
Hitman Profil |
#11 · Zasláno: 21. 1. 2016, 22:11:58
Proč ne? Pokud budu chtít změnit ID zákazníka, budu řešit obdobný problém.
Vím že ID zase tak často měnit nebudu, ale šlo mi spíše o funkčnost, nejedná se o reálnou DB, pouze testování. |
||
Keeehi Profil |
#12 · Zasláno: 22. 1. 2016, 01:02:52
Hitman:
„Vím že ID zase tak často měnit nebudu,“ Lépe řečeno nikdy. Potřebuješ to čas od času měnit? Pak to nedávej jako primární klíč. Ale vytvoř si nový sloupeček s ID, které slouží jen a pouze k identifikaci řádku a nikdy se nemění. |
||
Časová prodleva: 8 let
|
0