Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno MS SQL dotaz

Potreboval by som pomoct s dotazom
1. tabulka = rodne cislo, meno, priezvisko a podobne
2. tabulka - rodne cislo, typ, hodnota
tabulky su previazane cez rc, 1:N, v druhej tabulke su v podstate rozsirujuce udaje, v stlpci typ je nazov udaju, v stlpci hodnota je jeho hodnota. Napr pre rodne cislo 11111111/1111 moze byt v tbl 2 zapis niekolko riadkov rc, typ , hodnota napr.
ulica-Novotna, tel-123456, heslo- abcdef, email-jaja@ab.sk, ulica_cislo-20, mobil-09012345678 atd atd

Potrebujem vytiahnut z prvej tabulky rc, meno ak v druhej tabulke chyba riadok v type napr. heslo a email, resp. je typ alebo email ale hodnota pre ne je prazdna, teda maju zadanu napr len ulicu a ulica_cislo
polozka v stlpci typ je v podstate lubovolna (podla cislenika) . . .
Mozno to je blbo navrhnuta struktura, ale ja s tym uz nic nespravim . . . a aj toto je v podstate len taka jednorazova zostava.
Musi to byt jeden select, ziaden program alebo makro alebo funkcia, ak by mal niekto napad, tak dik.
Dufam ze som to napisal zrozumitelne.

Předmět Autor Datum
Myslis neco takove? SELECT prva.rodne_cislo,prva.jmeno, druha.typ,druha.hodnota FROM tab1 AS prva…
gilhad 08.09.2020 19:40
gilhad
No, nie tak celkom. Musí mi vypísať tých, ktorí ani nemajú vyplnenú položku typ, teda nie len že nez…
truhlik 08.09.2020 21:35
truhlik
Pak mozna neco jako: SELECT prva.rodne_cislo,prva.jmeno, e.typ,e.hodnota, h.typ,h.hodnota FROM tab…
gilhad 09.09.2020 03:15
gilhad
Hneď ráno na to pozriem, možno ako návod a nakopnutie bude stačiť :-)
truhlik 08.09.2020 21:38
truhlik
Ano, je to špatný návrh databáze. Pokud máš tabulku, kde máš různé typy dat, pak potřebuješ další ta…
Jan Fiala 09.09.2020 08:34
Jan Fiala
DAkujem vsetkym, ako to byva, netreba sa do vsetkeho hned hrnut, treba to nechat chvilu vyhnit, nako… poslední
truhlik 09.09.2020 11:45
truhlik

Myslis neco takove?


SELECT prva.rodne_cislo,prva.jmeno, druha.typ,druha.hodnota
  FROM tab1 AS prva
  LEFT JOIN tab2 AS druha 
    ON prva.rodne_cislo = druha.rodne_cislo AND ( druha.typ = "email" OR druha.typ="heslo" )
WHERE druha.hodnota IS NULL OR druha.hodnota = ""

kde ti vyjede neco jako


prva.rodne_cislo | prva.jmeno | druha.typ | druha.hodnota
111111/1111      | Pepa       | email     | 
111111/1111      | Pepa       | heslo     | NULL
222111/1111      | Franta     | heslo     | 
333111/1111      | Tomas      | heslo     | NULL
444111/1111      | Adam       | email     | 
555111/1111      | Venca      | email     | NULL

kde Pepa zadal prazdny email a nezadal heslo, Franta zadal prazdne heslo, Tomas heslo nezadal, Adam zadal prazdny email ale heslo zadal a Venca nezadal email ale heslo zadal ?

(Pepa je dvakrat, protoze ma dva hrichy)

https://dev.mysql.com/doc/refman/8.0/en/join.html

No, nie tak celkom. Musí mi vypísať tých, ktorí ani nemajú vyplnenú položku typ, teda nie len že nezadali heslo alebo ho nechali prázdne, aké k danej osobe chyba celý riadok záznamu v druhej tabulke. Problém je ten, ze môže mať záznam heslo, ale záznam email nielen že nemusí byť vyplnený alebo prázdny, ale vôbec nemusí existovať, teda vôbec nebude riadok s typ=email. Stačí jedna chyba, ci prázdny, ci null, alebo vôbec chyba riadok, a vypíše mi tu osobu ale len raz. Ak má zadané a vyplnené email a heslo tak nic, je ok, nieje vo vypise. D.

Pak mozna neco jako:



SELECT prva.rodne_cislo,prva.jmeno, e.typ,e.hodnota, h.typ,h.hodnota
  FROM tab1 AS prva  
  LEFT JOIN tab2 AS e
    ON prva.rodne_cislo = e.rodne_cislo AND e.typ = "email"
  LEFT JOIN tab2 AS h
    ON prva.rodne_cislo = h.rodne_cislo AND h.typ = "heslo" 
WHERE
    e.rodne_cislo IS NULL OR e.hodnota IS NULL OR e.hodnota = "" 
  OR
    h.rodne_cislo IS NULL OR h.hodnota IS NULL OR h.hodnota = ""

a melo by z toho lezt neco jako (pisu z hlavy)


prva.rodne_cislo | prva.jmeno | e.typ | e.hodnota| h.typ | h.hodnota
111111/1111      | Pepa       | email |          | NULL  | NULL
222211/1111      | Venca      | email | nedam    | NULL  | NULL

Pepa email nevyplnil a heslo nema vubec, Venca email vyplnil ("nedam") a heslo nema vubec

Ano, je to špatný návrh databáze.
Pokud máš tabulku, kde máš různé typy dat, pak potřebuješ další tabulku, kde bude seznam těch typů (o referenční integritě ani nemluvím).
Pokud budeš mít seznam typů, pak si jednoduše jedním dotazem vypíšeš, vše, co ti chybí v tabulce 2.
Použij LEFT OUTER JOIN

Jinak bys tu tabulku se seznamem musel v tomto dotazu (a ve všech dalších) uměle vytvářet.

select * 
	from (values ('ulica'), ('telefon'), ('email'), ('mobil')) pom (TypDat)

Pak by to mohlo vypadat nejak takto, chybejici typy si dopln.

SELECT tab1.rodne_cislo, tab1.jmeno, tab2.typ, tab2.hodnota
  FROM tab1 
  JOIN (values ('ulica'), ('telefon'), ('email'), ('mobil')) pom (TypDat) on 1=1  -- kartezsky soucin
  LEFT OUTER JOIN tab2 ON tab1.rodne_cislo = tab2.rodne_cislo and pom.TypDat = tab2.Typ
  WHERE tab2.Typ is null

Pokud bys mel tabulku se seznamem typu, pak ji tam das misto toho konstruktu

Zpět do poradny Odpovědět na původní otázku Nahoru