Autor Téma: Union  (Přečteno 4028 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7430
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Union
« kdy: 29-01-2013, 15:51:28 »
Ja už z toho porodím. Úplne jednoduchá záležitosť.
Kód: [Vybrat]
SELECT
     Bookentries.Idbookentries
   FROM Bookentries
union
SELECT
     Typedocuments.Idtypedocuments
   FROM Typedocuments
  ORDER BY Typedocuments.Idtypedocuments
Zahlási mi
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid command.
invalid ORDER BY clause.
Win11 64b, Delphi 12.2, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3534
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Union
« Odpověď #1 kdy: 29-01-2013, 16:35:36 »
Ja už z toho porodím. Úplne jednoduchá záležitosť.
No ona tak jednoducha zase neni: pokud nepouzijes aliasy, tak UNION nema definovana jmena sloupcu a pro zajimavost, pokud bys pouzival zavrzeni hodnou * u selectu, tak tabulky nemusi mit nutne stejna poradi sloupcu a pak to taky nefunguje...

Reseni je nekolik:
1. pouzit aliasy pro jmena poli (nevim, jestli funguje u kazde DB)
2. v order by nepouzit jmeno ale poradove cislo pole v result setu (nic moc, ale melo by fungovat vsude)
3. pouzit vnoreny select, tj. select xxxx from (select .... union ....) order by xxxx

Offline pepak

  • Padawan
  • ******
  • Příspěvků: 1574
  • Karma: 37
    • Pepak.net
Re:Union
« Odpověď #2 kdy: 29-01-2013, 18:06:17 »
Ja už z toho porodím. Úplne jednoduchá záležitosť.
Jak chceš řadit podle pole Typedocuments.Idtypedocuments, které v řazené tabulce vůbec není? (Pozn.: Řazení se aplikuje na výsledek UNIONu, ne na jeho části.) Použij třeba ORDER BY 1.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7430
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:Union
« Odpověď #3 kdy: 30-01-2013, 08:32:29 »
Ja vychádzam vždy z Access-u. Nič iné som predtým nepoužíval. Včera večer som zistil, že ten index to rieši.
Takže rozhodujúci je prvý SELECT? Hneď si to vyskúšam.
Ďakujem.
Win11 64b, Delphi 12.2, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline pepak

  • Padawan
  • ******
  • Příspěvků: 1574
  • Karma: 37
    • Pepak.net
Re:Union
« Odpověď #4 kdy: 30-01-2013, 08:57:19 »
Takže rozhodujúci je prvý SELECT? Hneď si to vyskúšam.
Ne. Kde jsi k tomuhle došel? Psal jsem, že ORDER BY se aplikuje na výsledek UNIONu.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7430
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:Union
« Odpověď #5 kdy: 30-01-2013, 09:01:01 »
// Psal jsem, že ORDER BY se aplikuje na výsledek UNIONu.

Ale čo je ten výsledok? Aké sú tam pravidlá pre jeho vytváranie? Podľa mojej logiky sa môže riadiť buď prvým alebo posledným SELECT-om. Ale mám hrubú knihu. Možno tam o tom niečo bude.
Múdra kniha "Pretože stĺpce vo dvoch tabuľkách môžu mať rôzne názvy, stĺpce výsledkov dopytu vytvorené operáciou UNION sú nepomenované". Teraz si to preložte späť do češtiny :)
Už viem ako sa zariadiť.
« Poslední změna: 30-01-2013, 09:11:29 od Stanislav Hruška »
Win11 64b, Delphi 12.2, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline pepak

  • Padawan
  • ******
  • Příspěvků: 1574
  • Karma: 37
    • Pepak.net
Re:Union
« Odpověď #6 kdy: 30-01-2013, 09:17:06 »
Ale čo je ten výsledok?
Výsledek je relace (tabulka), která z toho UNIONu vyleze předtím, než na ni začneš aplikovat řazení, výběry a podobně. Tzn. v tvém případě v nějakém náhodném pořadí obsah sloupečku Bookentries.Idbookentries a obsah sloupečku Typedocuments.Idtypedocuments. Ale ten výsledný sloupeček se nejmenuje ani Typedocuments.Idtypedocuments ani Bookentries.Idbookentries - asi se jmenuje Idbookentries, ale měl bys ho vždy explicitně pojmenovat:
Kód: SQL [Vybrat]
  1. SELECT
  2.      Bookentries.Idbookentries ID
  3.    FROM Bookentries
  4. UNION
  5. SELECT
  6.      Typedocuments.Idtypedocuments ID
  7.    FROM Typedocuments
Pak je jasné, že se ten sloupeček jmenuje ID.

Citace
Aké sú tam pravidlá pre jeho vytváranie?
To by sis případně dohledal v dokumentaci, nebo se můžeš zkusit zeptat na Firebird listu. Já jsem to v životě nepotřeboval vědět.