sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL -måste visas i GROUP BY-satsen eller användas i en aggregerad funktion

Om user_id är PRIMÄRNYCKLEN då behöver du uppgradera PostgreSQL; nyare versioner kommer att hantera gruppering efter primärnyckeln korrekt.

Om user_id är varken unik eller den primära nyckeln för "gods"-relationen i fråga, så är den här frågan inte så vettig, eftersom PostgreSQL inte har något sätt att veta vilken värde att returnera för varje kolumn i estates där flera rader delar samma user_id . Du måste använda en aggregatfunktion som uttrycker vad du vill ha, som min , max , avg , string_agg , array_agg , etc eller lägg till kolumnen/kolumnerna av intresse i GROUP BY .

Alternativt kan du formulera om frågan till att använda DISTINCT ON och en ORDER BY om du verkligen vill välja en något godtycklig rad, men jag tvivlar verkligen på att det är möjligt att uttrycka det via ActiveRecord.

Vissa databaser - inklusive SQLite och MySQL - väljer bara en godtycklig rad. Detta anses vara felaktigt och osäkert av PostgreSQL-teamet, så PostgreSQL följer SQL-standarden och anser att sådana frågor är fel.

Om du har:

col1    col2
fred    42
bob     9
fred    44
fred    99

och du gör:

SELECT col1, col2 FROM mytable GROUP BY col1;

då är det självklart att du ska få raden:

bob     9

men hur är resultatet för fred ? Det finns inget rätt svar att välja, så databasen kommer att vägra utföra sådana osäkra frågor. Om du ville ha det bästa col2 för någon col1 du skulle använda max sammanlagd:

SELECT col1, max(col2) AS max_col2 FROM mytable GROUP BY col1;


  1. Finns det något sätt att använda Linq till Oracle

  2. Är en CASE-sats och en DECODE ekvivalenta?

  3. Optimera TempDB:Undvika flaskhalsar och prestandaproblem

  4. Sammanfoga kolumnvärden till en kommaseparerad lista