sql >> Database >  >> RDS >> Mysql

Groeperen op clausule in mySQL en postgreSQL, waarom de fout in postgreSQL?

U moet AGGREGATE FUNCTIE gebruiken :

Aggregaatfuncties berekenen een enkel resultaat uit een reeks invoerwaarden.

SELECT col2, MIN(col3) AS col3, MIN(col1) AS col1
FROM the_table 
GROUP BY col2;

db<>fiddle-demo

MySQL-verwerking van GROUP BY :

In standaard-SQL kan een query die een GROUP BY-clausule bevat, niet verwijzen naar niet-geaggregeerde kolommen in de selectielijst die niet zijn genoemd in de GROUP BY-clausule

en:

MySQL breidt het gebruik van GROUP BY uit, zodat de selectielijst kan verwijzen naar niet-geaggregeerde kolommen die niet worden genoemd in de GROUP BY-clausule. Dit betekent dat de voorgaande query legaal is in MySQL. U kunt deze functie gebruiken om betere prestaties te krijgen door onnodig sorteren en groeperen van kolommen te vermijden. Dit is echter vooral handig wanneer alle waarden in elke niet-geaggregeerde kolom die niet in de GROUP BY-naam is genoemd, voor elke groep hetzelfde zijn. De server is vrij om elke waarde uit elke groep te kiezen, dus tenzij ze hetzelfde zijn, zijn de gekozen waarden onbepaald

Dus met de MySQL-versie zonder expliciete aggregatiefunctie kunt u eindigen met niet-deterministische waarden. Ik raad ten zeerste aan om een ​​specifieke aggregatiefunctie te gebruiken.

BEWERKEN:

Van MySQL-verwerking van GROUP BY :

SQL92 en eerder staan ​​geen query's toe waarvoor de selectielijst, HAVING-voorwaarde of ORDER BY-lijst verwijzen naar niet-geaggregeerde kolommen die niet worden genoemd in de GROUP BY-clausule.

SQL99 en hoger staan ​​dergelijke niet-aggregaten per optionele functie T301 toe als ze functioneel afhankelijk zijn van GROUP BY-kolommen: Als een dergelijke relatie bestaat tussen naam en voogd, is de vraag legaal. Dit zou bijvoorbeeld het geval zijn als een primaire sleutel van klanten zou worden bewaard.

Voorbeeld:

SELECT o.custid, c.name, MAX(o.payment)
FROM orders AS o
JOIN customers AS c
  ON o.custid = c.custid
GROUP BY o.custid;


  1. RazorSQL verbinden met Salesforce.com

  2. Is de OraOLEDB-provider in .NET onbetrouwbaar op CLOB-velden?

  3. Vergelijking van databasekolomtypen in MySQL, PostgreSQL en SQLite? (cross-mapping)

  4. Hoe transformeer je een MSSQL CTE-query naar MySQL?