Autor Zpráva
Hitman
Profil
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 *
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
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
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
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
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
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í.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0