sql >> Database >  >> RDS >> PostgreSQL

Vraag naar ORDER BY het aantal rijen dat is geretourneerd door een andere SELECT

De Postgres-manier om dit te doen:

SELECT *
FROM   users u
LEFT   JOIN (
   SELECT user_id, count(*) AS friends
   FROM   friends
   ) f USING (user_id)
ORDER  BY f.friends DESC NULLS LAST, user_id  -- as tiebreaker
  • Het trefwoord AS is gewoon ruis voor tabelaliassen. Maar laat het niet weg uit kolomaliassen. De handleiding over "Het AS-sleutelwoord weglaten":

    In FROM items, zowel de standaard als PostgreSQL staan ​​AS toe moet worden weggelaten vóór een alias die een niet-gereserveerd sleutelwoord is. Maar dit is onpraktisch voor namen van uitvoerkolommen, vanwege syntactische dubbelzinnigheden .

    Vetgedrukte nadruk van mij.

  • ISNULL() is een aangepaste extensie van MySQL of SQL Server. Postgres gebruikt de SQL-standaardfunctie COALESCE() . Maar dat heb je hier ook niet nodig. Gebruik de NULLS LAST clausule in plaats daarvan, die sneller en schoner is. Zie:

    • PostgreSQL sorteren op datum/tijd asc, eerst null?
  • Meerdere gebruikers hebben hetzelfde aantal vrienden. Deze peers zouden willekeurig worden gesorteerd. Herhaalde uitvoering kan een andere sorteervolgorde opleveren, wat doorgaans niet wenselijk is. Voeg meer uitdrukkingen toe aan ORDER BY als tiebreak. Uiteindelijk lost de primaire sleutel alle resterende ambiguïteit op.

  • Als de twee tabellen dezelfde kolomnaam hebben user_id (zoals ze zouden moeten) je kunt de syntaxissnelkoppeling USING . gebruiken in de join-clausule. Een andere standaard SQL-functie. Welkom neveneffect:user_id wordt slechts één keer vermeld in de uitvoer voor SELECT * , in tegenstelling tot bij deelname met ON . Veel klanten accepteren zelfs geen dubbele kolomnamen in de uitvoer.



  1. Oracle/SQL:waarom vraagt ​​​​query SELECT * FROM records WHERE rownum>=5 AND rownum <=10 - retourneert nul rijen

  2. Een query maken in SQL Server 2017

  3. MAAK TABEL INDIEN NIET BESTAAT equivalent in SQL Server

  4. De volgorde van tekens in een tekenreeks omkeren in MySQL