Diskuze: MSSQL - Inner join - Where
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 9 zpráv z 9.
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
Nedávno jsem řešil něco podobného. Ten tvůj druhý dotaz bych udělal spíš takhle
SELECT * FROM faktury f
INNER JOIN uzivatele u ON f.ID_Uzivatele=u.ID AND u.Oddeleni='IT'
WHERE u.Bydliste = 'IT'
Ta druhá podmínka by taky možná šla vložit přímo do JOINU, to už si musíš vyzkoušet sám
Ahoj,
orientace zpracování dotazů funguje v tomto pořadí:
FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY.
V tvém případě bych určitě postupoval takto:
SELECT *
FROM faktury AS f
JOIN uzivatele AS u ON f.ID_Uzivatele = u.ID
AND u.Bydliste = 'IT'
Tím se vyhneš celé klauzuli WHERE a rovnou si vyfiltruješ daný JOIN. Ze svých zkušeností a z kurzů vím, že je tato možnost nejpřesnější.
Matěj
Mám tam překlep, mělo to být WHERE u.Bydliste = 'Ostrava' jako další podmínka.
Každopádně teď zkouším a zkouším Nevěděl jsem, že za ON
podmínka může být AND.
Tahám data ze SAP databáze, kde jsou statisíce řádků a selecty potřebuji co nejrychleji.
Jen bych se chtěl zeptat jen tak offtopic - dá se v MSSQL management studiu zjistit v záložce Results ke které tabulce daný sloupec náleží ?
Nebo zda jde zapnou jakýsi "rozdělovač", který mi ukáže ve výsledcích, kde už začíná další tabulka.
Děkuji
Ja bych sloupce pojmenoval takto, podle vyznamu
uzivatele: id_uzivatel, Jmeno, Bydliste, Oddeleni, ...
faktury: id_faktura, Castka, ...
uzivatel_faktury: id_uzivatel, id_faktura
Joiny obvykle nepouzival, jenom LEFT JOIN, ale nemel bys do selectu vypsat
jmena sloupcu? Pokud se bude kryt nazev sloupce z tab a s jinym v b, tak SELECT
* bude pindat error.
Nevim, jestli bych u joinu resil AND u.Bydliste = 'IT', spis bych to dal pak do
where. Ale to bych musel testnout, co je rychlejsi. Teoreticky WHERE, protoze se
nemusi kontrolovat join s podminkou.
A potom bych teda asi pouzil treti tabulku pro propojeni uzivatel faktura. Ale
to je na uvazeni. Zhlediska rychlosti by nemel byt rozdil.
SELECT uf.id_faktura, u.jmeno, f.castka
FROM uzivatel_faktury uf
LEFT JOIN uzivatele u ON u.id_uzivatel = uf.id_uzivatel
-- nemusis premyslet nad nazvy sloupcu, protoze mas v obou tabulkach stejne pojmenovane sloupce
LEFT JOIN faktury f ON f.id_faktura = uf.id_faktura
WHERE u.Oddeleni= 'IT'
Navic bych na Oddeleni udelal extra tabulku a filtroval to pomoci id, ne (u.Oddeleni= 'IT'), o.Oddeleni= 1.
S temi sloupci a tabulkami moc nerozumim. Ale, neznam ten program...
Select vybere data z tabulek a vrati tabulku. Ktery sloupec tam chces , v jakem
poradi si definujes za SELECT slovem. Pokud tam mas *, tak to bere vsechny
sloupce. Poradi tabulek bude, jake mas definovane za FROM, ne? * pouzivaji jen
ti nejvetsi luzri Kteri si
radi pridelavaji pozdeji problemy.
Mimochodem...
Co kdyby se uzivatel prestehoval? Ve starych fakturach budes mit novou adresu?
To je preci spatne, ne?
A co kdyby zmenil jmeno, slecna se provda. Ve starych fakturach bude figurovat
nove jmeno?
A co kdyz meni pohlavi?
K tem tabulkam, znovu jsem si to precetl... V mem pripade to funguje takto:
FROM uzivatel_faktury uf
LEFT JOIN uzivatele u ON u.id_uzivatel = uf.id_uzivatel
-- nemusis premyslet nad nazvy sloupcu, protoze mas v obou tabulkach stejne pojmenovane sloupce
LEFT JOIN faktury f ON f.id_faktura = uf.id_faktura
Otevri tabulku uzivatel_faktury. Ke kazdemu radu pridej data z uzivatele a z
faktury (resp, on tam prida jen ukazatel/pointer databaze.tabulka.radek).
Ziska jednu obri tabulku. Poradi radku bude podle tabulky uzivatel_faktury.
A na zaver posklada data do tabulky podle toho, co mas v SELECT. Jestli tam mas
GROUP BY, WHERE a tak, tak to filtruje.
Jo, jestli chces mit na konci nejake poradi, zkus pouzit ORDER BY (mysql), v msql nevim. Tam se ale tusim pise jinak jen LIMIT.
Zobrazeno 9 zpráv z 9.