Autor Téma: UNION a ORDER BY  (Přečteno 1029 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2738
  • Karma: 26
    • Verze Delphi: XE7 professional
UNION a ORDER BY
« kdy: 29-11-2016, 19:50:44 »
Vyhadzuje mi chybu.
Citace
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid command.
Invalid ORDER BY clause.
Ja tam žiadnu nevidím. A ORDER BY je podľa dokumentácie podporované.
Kód: [Vybrat]
SELECT LANDLORDS.FULLNAME, FLATS.FLATNUMBER
FROM LANDLORDS
INNER JOIN LANDLORD_FLAT ON (LANDLORDS.IDLANDLORDS = LANDLORD_FLAT.FKLANDLORD)
INNER JOIN FLATS ON (LANDLORD_FLAT.FKFLAT = FLATS.IDFLATS)
WHERE LANDLORD_FLAT.FKFOCS = 1776
UNION
SELECT USERS.FULLNAME, FLATS.FLATNUMBER
FROM LANDLORD_FLAT
INNER JOIN FLATS ON (LANDLORD_FLAT.FKFLAT = FLATS.IDFLATS)
INNER JOIN USERS ON (LANDLORD_FLAT.IDLANDLORD_FLAT = USERS.FKLANDLORD_FLAT)
WHERE LANDLORD_FLAT.FKFOCS = 1776
ORDER BY FULLNAME

Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2738
  • Karma: 26
    • Verze Delphi: XE7 professional
Re:UNION a ORDER BY
« Odpověď #1 kdy: 29-11-2016, 20:09:09 »
Vyhrabal som na internete toto
Kód: [Vybrat]
SELECT FULLNAME, FLATNUMBER
FROM
(SELECT LANDLORDS.FULLNAME, FLATS.FLATNUMBER
FROM LANDLORDS
INNER JOIN LANDLORD_FLAT ON (LANDLORDS.IDLANDLORDS = LANDLORD_FLAT.FKLANDLORD)
INNER JOIN FLATS ON (LANDLORD_FLAT.FKFLAT = FLATS.IDFLATS)
WHERE LANDLORD_FLAT.FKFOCS = 1776
UNION
SELECT USERS.FULLNAME, FLATS.FLATNUMBER
FROM LANDLORD_FLAT
INNER JOIN FLATS ON (LANDLORD_FLAT.FKFLAT = FLATS.IDFLATS)
INNER JOIN USERS ON (LANDLORD_FLAT.IDLANDLORD_FLAT = USERS.FKLANDLORD_FLAT)
WHERE LANDLORD_FLAT.FKFOCS = 1776)  RESULTS
ORDER BY FLATNUMBER
To funguje. Ale fungovať má aj prvý kód >:(  Použitie indexu namiesto názvu poľa nepomáha. A tento text sa mi bude skladať dosť zle. Užívateľ ma na výber, či použije iba prvý Select, alebo union, plus voľba radenia.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2738
  • Karma: 26
    • Verze Delphi: XE7 professional
Re:UNION a ORDER BY
« Odpověď #2 kdy: 29-11-2016, 20:12:13 »
Hm, funguje to aj v tejto podobe
Kód: [Vybrat]
SELECT FULLNAME, FLATNUMBER
FROM LANDLORDS
INNER JOIN LANDLORD_FLAT ON (LANDLORDS.IDLANDLORDS = LANDLORD_FLAT.FKLANDLORD)
INNER JOIN FLATS ON (LANDLORD_FLAT.FKFLAT = FLATS.IDFLATS)
WHERE LANDLORD_FLAT.FKFOCS = 1776
UNION
SELECT FULLNAME, FLATNUMBER
FROM LANDLORD_FLAT
INNER JOIN FLATS ON (LANDLORD_FLAT.FKFLAT = FLATS.IDFLATS)
INNER JOIN USERS ON (LANDLORD_FLAT.IDLANDLORD_FLAT = USERS.FKLANDLORD_FLAT)
WHERE LANDLORD_FLAT.FKFOCS = 1776
RESULTS
ORDER BY FLATNUMBER
Ale nie vo FireDAC FDQuery. Ja sa z toho picnem. Tam to ide ako má. Bez toho Results. Pôvodne som to skúšal v EMS SM.
« Poslední změna: 29-11-2016, 20:17:12 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Plnoletý
  • ***
  • Příspěvků: 236
  • Karma: 2
    • Verze Delphi: 10.2
Re:UNION a ORDER BY
« Odpověď #3 kdy: 29-11-2016, 21:59:04 »
Nepomohlo by psát:
Kód: [Vybrat]
SELECT
 LANDLORDS.FULLNAME as FullName,
 FLATS.FLATNUMBER
....
ORDER BY FullName
?


Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2738
  • Karma: 26
    • Verze Delphi: XE7 professional
Re:UNION a ORDER BY
« Odpověď #4 kdy: 29-11-2016, 22:02:43 »
Také niečo podobné nezabralo. Použil som v Select-och len skrátené názvy. FlatNumber, FullName. Pre mňa je rozhodujúci ten FireDAC. A ten je OK. EMS teraz vydalo novú verziu s podporou FB3 a v krátkej dobe vyšla ďalšia. Možno sa dočkám v krátkej dobe aj tretej verzie.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline KarelHorky

  • Plnoletý
  • ***
  • Příspěvků: 159
  • Karma: 6
    • Verze Delphi: 7, XE6
Re:UNION a ORDER BY
« Odpověď #5 kdy: 30-11-2016, 08:59:10 »
Kód: [Vybrat]
SELECT LANDLORDS.FULLNAME, FLATS.FLATNUMBER
FROM LANDLORDS
INNER JOIN LANDLORD_FLAT ON (LANDLORDS.IDLANDLORDS = LANDLORD_FLAT.FKLANDLORD)
INNER JOIN FLATS ON (LANDLORD_FLAT.FKFLAT = FLATS.IDFLATS)
WHERE LANDLORD_FLAT.FKFOCS = 1776
UNION
SELECT USERS.FULLNAME, FLATS.FLATNUMBER
FROM LANDLORD_FLAT
INNER JOIN FLATS ON (LANDLORD_FLAT.FKFLAT = FLATS.IDFLATS)
INNER JOIN USERS ON (LANDLORD_FLAT.IDLANDLORD_FLAT = USERS.FKLANDLORD_FLAT)
WHERE LANDLORD_FLAT.FKFOCS = 1776
ORDER BY FULLNAME
Server neví, který FULLNAME má použít. Toto by mělo fungovat, pokud použiješ zástupný index pro 1. sloupec:
Kód: [Vybrat]
ORDER BY 1
Pokud tam ovšem ve skutečnosti nemáš něco jiného, než je ukázáno tady...  :)
A pozor na UNION bez ALL !  V tomto tvaru dělá ve spojení DISTINCT ! Raději použij UNION ALL, pokud chceš ve výsledku všechny věty, které vyhoví podmínkám WHERE.
K.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2738
  • Karma: 26
    • Verze Delphi: XE7 professional
Re:UNION a ORDER BY
« Odpověď #6 kdy: 30-11-2016, 09:18:41 »
Citace
Toto by mělo fungovat, pokud použiješ zástupný index pro 1. sloupec
Ale nefungovalo. Ako som aj písal.
Citace
A pozor na UNION bez ALL !  V tomto tvaru dělá ve spojení DISTINCT ! Raději použij UNION ALL, pokud chceš ve výsledku všechny věty, které vyhoví podmínkám WHERE.
O tom viem, ale až tak som si to neuvedomil.
Lenže pri použití ALL je potrebné postupovať podľa #1. Viď stránku SO.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1751
  • Karma: 77
    • Verze Delphi: D2007, XE3, DX10
Re:UNION a ORDER BY
« Odpověď #7 kdy: 30-11-2016, 09:40:11 »
Také niečo podobné nezabralo.
Hmm, a pouzil jsi aliasy v obou selectech?

Kód: SQL [Vybrat]
  1. SELECT LANDLORDS.FULLNAME AS FULLNAME ...
  2.   ...
  3. UNION
  4. SELECT USERS.FULLNAME AS FULLNAME ...
  5.    ...
  6. ORDER BY FULLNAME
  7.  

Jestli si to spravne pamatuju, tak jmena sloupcu v result setu definuje 1. select, takze by teoreticky melo fungovat i

Kód: SQL [Vybrat]
  1. SELECT LANDLORDS.FULLNAME ...
  2.   ...
  3. UNION
  4. SELECT USERS.FULLNAME ...
  5.    ...
  6. ORDER BY LANDLORDS.FULLNAME
  7.  

A trideni indexem sloupce v result setu by melo fungovat v kazdem pripade



Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2738
  • Karma: 26
    • Verze Delphi: XE7 professional
Re:UNION a ORDER BY
« Odpověď #8 kdy: 30-11-2016, 09:43:27 »
Presne tak. A malo by to fungovať. Hľadám príčinu prečo to tak nie je. Na NB mi to (EMS SM, pripojenie k DB...) funguje ináč než na PC.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

 

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: