Autor Téma: DISTINCT či GROUP BY  (Přečteno 858 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7384
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
DISTINCT či GROUP BY
« kdy: 25-07-2023, 14:19:31 »
Mám dopyty s dvomi poľami: Integer a string
Vždy používam WHERE, takže vstupné údaje sa počítajú na stovky.
Takže momentálne nejde ani tak o výkon ako o čistý/správny kód.
.
Čo som čítal, tak sa DISTINCT veľmi neodporúča. S výnimkou, ak sú výstupy iba typu Integer. Aj to pár polí.
O GROUP BY neviem vôbec nič.
Nateraz som si zvolil GROUP BY.
.
Viete mi k tomu niečo povedať?
« Poslední změna: 25-07-2023, 14:23:07 od Stanislav Hruška »
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Jan Fiala

  • Hrdina
  • ****
  • Příspěvků: 437
  • Karma: 6
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:DISTINCT či GROUP BY
« Odpověď #1 kdy: 25-07-2023, 14:24:23 »
Distinct vybere data a pak vrati unikatni vety
Group by slouzi pro souctovani (vypocty) nad daty. Da se znasilnit, pokud pouzijes neco jako:
Select max(pole) as pole from...
Co vlastne ma byt vysledkem tveho dotazu?
Z kolika vet vybiras?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7384
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:DISTINCT či GROUP BY
« Odpověď #2 kdy: 25-07-2023, 17:26:56 »
Každá veta má byť raz - bez opakovania. Ja som si myslel, že DISTINCT to vysvetľuje. Uvádzam príklad GROUP BY
Kód: [Vybrat]
  const Basic = 'SELECT P.COUNTRYFK, C.TITLE'+
  ' FROM TEAM_SEASON TS'+
    ' INNER JOIN PLAYER_TEAM ON PLAYER_TEAM.TEAMFK = TS.TEAMFK'+
    ' INNER JOIN PLAYERS P ON PLAYER_TEAM.PLAYERFK = P.PALYERID'+
    ' INNER JOIN COUNTRIES C ON P.COUNTRYFK = C.COUNTRYID'+
  ' WHERE TS.SEASONFK = :SEASONFK'+
  ' GROUP BY P.COUNTRYFK, C.TITLE';
S DISTNICT bude takto
Kód: [Vybrat]
  const Basic = 'SELECT DISTINCT P.COUNTRYFK, C.TITLE'+
  ' FROM TEAM_SEASON TS'+
    ' INNER JOIN PLAYER_TEAM ON PLAYER_TEAM.TEAMFK = TS.TEAMFK'+
    ' INNER JOIN PLAYERS P ON PLAYER_TEAM.PLAYERFK = P.PALYERID'+
    ' INNER JOIN COUNTRIES C ON P.COUNTRYFK = C.COUNTRYID'+
  ' WHERE TS.SEASONFK = :SEASONFK';
Ide o to, čo je správnejšie. Viď tretí riadok otázky.
Citace
Z kolika vet vybiras?
Písal som že to sú rádovo stovky. Možno niekde nejaká tisícka - neviem.
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3526
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:DISTINCT či GROUP BY
« Odpověď #3 kdy: 26-07-2023, 07:00:58 »
Ide o to, čo je správnejšie.
GROUP BY se pouziva spolu s agregacnimi funkcemi a ty tam zadnou nemas -> to ti funguje spis dilem nahody a rekl bych, ze by te s tim slusny RDBMS vykopal...

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7384
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:DISTINCT či GROUP BY
« Odpověď #4 kdy: 26-07-2023, 08:15:21 »
Ide o to, čo je správnejšie.
GROUP BY se pouziva spolu s agregacnimi funkcemi a ty tam zadnou nemas -> to ti funguje spis dilem nahody a rekl bych, ze by te s tim slusny RDBMS vykopal...
V podstate som myslel na niečo také. Funguje mi to všade  :)  Samozrejme, že nebudem riskovať. Ďakujem. Zmením to na DISTINCT.
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7384
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:DISTINCT či GROUP BY
« Odpověď #5 kdy: 26-07-2023, 08:56:23 »
Nedalo mi to a hľadal som na internete. Našiel som na
https://stackoverflow.com/questions/19171901/how-to-use-group-by-in-firebird
Ďalším syntakticky platným použitím je získanie zoznamu odlišných hodnôt
Kód: [Vybrat]
SELECT TEST_DESC, MEASUREMENT, LL, UL FROM T_TABLE2 GROUP BY TEST_DESC, MEASUREMENT, LL, UL čo je ekvivalentné
Kód: [Vybrat]
SELECT DISTINCT TEST_DESC, MEASUREMENT, LL, UL FROM T_TABLE2 Podľa toho to je v poriadku. Viac tam k tomu nebolo.
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Padawan
  • ******
  • Příspěvků: 1567
  • Karma: 52
    • Verze Delphi: 11.3
Re:DISTINCT či GROUP BY
« Odpověď #6 kdy: 26-07-2023, 10:37:59 »
Taky si myslím, že použít GROUP BY pro tyhle účely není nijak zakázáno. Co jsem viděl zmínky, tak např. starší verze MS SQL ten DISTINCT prý zpracovaly rychleji než GROUP BY, ale novější verze to pak už měly nastejno. A pro MySQL jsem někde četl, že GROUP BY výsledky vracelo seřazené, zatímco DISTINCT ne.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7384
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:DISTINCT či GROUP BY
« Odpověď #7 kdy: 26-07-2023, 10:44:52 »

https://sonra.io/flowhigh/sql-antipatterns-select-distinct/
Toto je celkom zaujímavé. Aj s vysvetlením
Citace
SQL DISTINCT verzus SQL GROUP BY
Dotaz SELECT DISTINCT môžeme prepísať ako GROUP BY.
.
Namiesto
.
SELECT DISTINCT ss_customer_sk from "SAMPLE_DATA"."TPCDS_SF10TCL"."STORE_SALES";
Môžeme si písať
.
SELECT ss_customer_sk from "SAMPLE_DATA"."TPCDS_SF10TCL"."STORE_SALES" GROUP BY ss_customer_sk;
Tieto dva dotazy generujú presne rovnaký plán vysvetlenia a ich vykonanie trvá rovnako dlho.
.
Odporúčam použiť verziu DISTINCT, pretože zámer dotazu je jasnejší a zrejmejší. GROUP BY hovorí používateľovi, aby očakával agregáciu. DISTINCT hovorí používateľovi, aby očakával jedinečný zoznam hodnôt.
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3526
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:DISTINCT či GROUP BY
« Odpověď #8 kdy: 26-07-2023, 11:11:31 »
Odporúčam použiť verziu DISTINCT, pretože zámer dotazu je jasnejší a zrejmejší. GROUP BY hovorí používateľovi, aby očakával agregáciu. DISTINCT hovorí používateľovi, aby očakával jedinečný zoznam hodnôt.
Ano.

Me by nikdy nenapadlo pouzit GROUP BY bez agregacni funkce, i kdyz je jasne, ze RDBMS musi nejprve vnitrne vytvorit unikatni seznam zaznamu, ktere ma agregovat. Jestli to vsechny RDBMS, se kterymi jsem kdy pracoval, umoznuji, si nepamatuju. Nicmene bych to nikdy nepouzil.


Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3526
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:DISTINCT či GROUP BY
« Odpověď #9 kdy: 26-07-2023, 11:13:04 »
A pro MySQL jsem někde četl, že GROUP BY výsledky vracelo seřazené, zatímco DISTINCT ne.
Jenomze MySQL je (nebo aspon byla) parodie na DB :-D Jestli si to pamatuju, tak zrovna u toho GROUP BY umoznuje konstrukci, ze tam nemas vypsana vsechna neagregovana pole...

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7384
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:DISTINCT či GROUP BY
« Odpověď #10 kdy: 26-07-2023, 12:23:48 »
Neviem ako teraz, ale MySQL režimy. Nazvem ich
  • laický: ten umožňoval to, čo popisuješ. A mnohé iné svinstvá
  • plný SQL: ten vyžaduje dodržiavanie SQL štandardu v plnom rozsahu
Predvolené je 1.
Najzaujímavejšia je pre mňa informácia, že pre oba dopyty je plán totožný!
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.