#1 před 2 lety

romansklenar
Moderator
Registrovaný: 20. 7. 2008
Příspěvky: 780

Nefunkčnost dotazu, který v jiných db funguje

Zdravím, zkouším si hrát s PostgreSQL a narazil jsem na jeden problém v dotazu, který si nejsem schopný vysvětlit:

SELECT c.*, count(o."orderNumber") AS orders
FROM "Customers" AS c
LEFT JOIN "Orders" AS o ON c."customerNumber" = o."customerNumber"
GROUP BY c."customerNumber"

ERROR: column "c.customerName" must appear in the GROUP BY clause or be used in an aggregate function

Chyba je na řádku 1, znak 8. Očividně mu vadí c.*, protože když ho nahradím za nějaký konkrétní atribut, dotaz projde. Přidat c.customerName za GROUP BY taky nepomůže, protože pak dotaz skončí na té samé chybě ale v chybovém hlášení se objeví následující atribut tabulky… Nechápu ale proč chce, abych ho obalil agregační funkcí.

Existuje nějaký způsob jak rozjet tento dotaz, aniž bych musel ručne vypsat do selectu všechny atributy tabulky Customers?

 

#2 před 2 lety

kosoj
Člen
Registrovaný: 21. 1. 2009
Příspěvky: 10

Re: Nefunkčnost dotazu, který v jiných db funguje

Pokud chceš použít skupinovou funkci, tak musíš vyjmenovat slopce, dle kterých se mají hodnoty počítat.

Mělo by se to dát obejít nějak takhle:

SELECT c.*,
       (SELECT COUNT(1)
          FROM "Orders" AS o
         WHERE c."customerNumber" = o."customerNumber") AS orders_count
  FROM "Customers" AS c

 

#3 před 2 lety

Kevujin
Člen
Registrovaný: 6. 1. 2009
Příspěvky: 11

Re: Nefunkčnost dotazu, který v jiných db funguje

no když se nad tím dotazem zamyslíš, tak ti musí dojít, že je to vlastně hloupost, ne? všechny sloupce, který chceš vybrat (kromě těch v agregačních funkcích) musíš dát taky do group by. jak by databáze mohla vědět, jakou hodnotu ti má vrátit např. v tom customerName, když bude groupovat podle něčeho jinýho. tohle povoluje snad akorát mysql (myslím) a pak tam vrací samozřejmě nějaký data, jak se jí to hodí (což je špatně), vůbec se nemůžeš spolehnout, co dostaneš.

zamysli se nad tímhle (zjednodušeně)

id,customerName,customerNumber
1,karel,10
2,petr,10

dáš-li group by customerNumber, dostaneš jen jeden řádek, ale co by mělo obsahovat customerName?

Editoval Kevujin (30. 10. 2009 12:14)

 

#4 před 2 lety

phx
Moderator
Registrovaný: 17. 4. 2008
Příspěvky: 878

Re: Nefunkčnost dotazu, který v jiných db funguje

MySQL vraci pri GROUP prvni radek. Jde se na to spolehnout pokud vis jak data radis (coz vis zcela jiste kdyz pouzijes ORDER).

Timto se da vyresit problem u MySQL. Protoze napr kdyz pocitas pocet produktu v kategorii je vhodnejsi vylistovat kategorie, joinout produkty, a groupnout dle idCategory. A nemusim se v group vypisovat se vsemi parametry tabulky kategorie. Je dokonce mozne ziskat prvni produkt z kategorie i kdyz nevim k cemu by to bylo vhodne.

Druhe reseni co se nabizi je vylistovat kategorie a ke kazdy kategorii udelat subdotaz na pocet produktu kategorie. Zde MySQL provede 1+N dotazu kde N je pocet kategorii. Coz muze byt casove dost narocne oproti jednomu slozitejsimu dotazu. Vyuziti indexu zde je skoro indenticke takze rozdil je pouze v poctech dotazu.

 

#5 před 2 lety

romansklenar
Moderator
Registrovaný: 20. 7. 2008
Příspěvky: 780

Re: Nefunkčnost dotazu, který v jiných db funguje

OK, díky za odpovědi, je fajn vědět, že toto fórum ještě někdo čte ;)

Kevujin: v tom případě co jsem psal nahoře je o.orderNumber a c.customerNumber primárním klíčem, takže je tam zaručena unikátnost a takový případ, že by nevěděl co vybrat nenastane.

 

Zápatí