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

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2850
  • Karma: 26
    • Verze Delphi: XE7 professional
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.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1788
  • Karma: 77
    • 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

  • Guru
  • *****
  • Příspěvků: 1288
  • Karma: 28
    • 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ů: 2850
  • Karma: 26
    • Verze Delphi: XE7 professional
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.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1288
  • Karma: 28
    • 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ů: 2850
  • Karma: 26
    • Verze Delphi: XE7 professional
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 »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1288
  • Karma: 28
    • 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.

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Datový typ v Delphi, který má True a False: