Hledáme nového kolegu do redakce - 100% home office, 100% flexibilní pracovní doba. Více informací.
Využij akce až 80 % zdarma při nákupu e-learningu - více informací. Zároveň pouze tento týden sleva až 80 % na e-learning týkající se Swift
discount week 80

Diskuze: Duplicita riadkov pri spoejeni DB

Aktivity
Avatar
Roman Arpas
Člen
Avatar
Roman Arpas:2.10.2019 19:25

Ahojte, mam problem ze ak spajam hlavnu DB s inu databazou sa mi zdupluju riadky.
Laicky povedane .. V nasej oprave mame 1 zakazku ktoru spojim s databazaou pouzitych dielmi a tam mam pri MS ACCESS hned 3 riadky, lebo 3 diely sa viacu na tu opravu na ten indentifikator.

Ako je mozne dosiahnut to, ze pri jednom udaje sa nebudu duplikovat udaje ale zapisu za sebou do vysledku?

Zkusil jsem: Vsetko, toto ked vyriesim budem rad kedze SQL sa ucim

Chci docílit: vysledku

 
Odpovědět
2.10.2019 19:25
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:3.10.2019 8:51

Nerozumim tvemu popisu. Nepouzivam MS Access, tak je to mozna tim. Uvedu priklad pro mysql.

tab zakazka - id_zakazka, text (5 radku)
tab dily - id_dil, text (20 radku)
tab zakazka_dily - id_zakazka, id_dil (30 radku, propojovaci tabulka mezi dily a zakazkami)

SELECT * FROM dily -- zobrazi 20 radku
SELECT * FROM zakazka_dily -- zobrazi 30 radku
SELECT * FROM zakazka_dily WHERE id_zakazka=3967 -- zobrazi 3 radky

SELECT a.id_dil, b.*
FROM zakazka_dily a
    LEFT JOIN zakazka b ON b.id_zakazka=a.id_zakazka
WHERE a.id_zakazka=3967
 -- zobrazi 3 radky, sloupce a.id_dil, b.id_zakazka, b.text (cili detaily o zakazce)

SELECT a.id_dil, b.*
FROM zakazka_dily a
    LEFT JOIN zakazka b ON b.id_zakazka=a.id_zakazka
WHERE a.id_zakazka=3967
GROUP BY a.id_zakazka
-- zobrazi 1 radek pro 1 zakazku s id 3967, 1 id_dil (to spis nechces)

SELECT a.id_dil, b.*, GROUP_CONCAT(a.id_dil)
FROM zakazka_dily a
    LEFT JOIN zakazka b ON b.id_zakazka=a.id_zakazka
WHERE a.id_zakazka=3967
GROUP BY a.id_zakazka
-- zobrazi 1 radek pro 1 zakazku s id 3967, 3x id_dil oddelene carkou
-- cili zgrupoval jsem to podle id_zakazka a pouzil funkci GROUP_CONCAT
-- nad sloupcem id_dil aby mi sloupec spojila do retezce a oddelila hodnoty carkou.

V MS Access urcite existuje podobna funkce, mozna CONCAT, WS_CONCAT nebo jinak, jestli chces dolicit prave tohoto.
google = MS Access group concat

 
Nahoru Odpovědět
3.10.2019 8:51
Avatar
Odpovídá na Roman Arpas
Michal Haňáček:3.10.2019 9:05

Ahoj, velmi pravděpodobně máš jen zle sestavený dotaz. Tipoval bych to na nevhodně zvolený join, který ti násobí řádky (např. relační vazba přes víc klíčů, ale v joinu probádíš vazbu před jeden atribut).

Můžeš sem ten dotaz poslat + ideálně i strukturu té DB?

Nahoru Odpovědět
3.10.2019 9:05
Každé rozhodnutí a každý krok v životě nás někam posune. Bohužel jen některé nás posouvají dopředu.
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Roman Arpas
Člen
Avatar
Roman Arpas:3.10.2019 9:52

Ahoj, staci ti takto poslat SQL kod? Niesom moc dobry v accesse ale tento problem by som rad vyriesil.

Su to vlastne 2 tabulke, kde v prvej mam udaj a ked spojim s dalsiou tak tam je to v troch riadkov kedze kazdy riadok obsahuje iny zaznam.

SELECT public_PPI_Re­pair.protocol, public_PPI_Re­pair_Itm.stoc­k_id
FROM public_PPI_Repair LEFT JOIN public_PPI_Re­pair_Itm ON public_PPI_Re­pair.repair = public_PPI_Re­pair_Itm.repa­ir
WHERE (((public_PPI_Re­pair.protocol)=[Za­daj cislo protokolu]));

 
Nahoru Odpovědět
3.10.2019 9:52
Avatar
Ondřej Crha
Člen
Avatar
Ondřej Crha:4.10.2019 15:43

Jestli tomu rozumím správně, potřebuješ všechna stock_id "smrsknout" do jednoho pole, asi takhle?

5974979 3009-001705, GH96-12724A, GH81-16831A

Pokud ano, tak MS Access - pokud vím - tohle sám o sobě neumí a musí se řešit pomocí User Defined Function, viz diskuze na StackOverflow, kde se můžeš inspirovat řešením.

 
Nahoru Odpovědět
4.10.2019 15:43
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 5 zpráv z 5.