sql >> Databasteknik >  >> RDS >> Sqlserver

Fel ordning i tabellvärderad funktion (håll ordning på en rekursiv CTE)

Det korrekta sättet att göra din BESTÄLLNING är att lägga till en ORDER BY-klausul till ditt yttersta urval. Allt annat förlitar sig på implementeringsdetaljer som kan ändras när som helst (inklusive om storleken på din databas/tabeller ökar, vilket kan tillåta mer parallell bearbetning).

Om du behöver något bekvämt för att beställningen ska kunna ske, titta på exempel D i exemplen från MSDN-sida på WITH :

WITH DirectReports(ManagerID, EmployeeID, Title, EmployeeLevel) AS 
(
    SELECT ManagerID, EmployeeID, Title, 0 AS EmployeeLevel
    FROM dbo.MyEmployees 
    WHERE ManagerID IS NULL
    UNION ALL
    SELECT e.ManagerID, e.EmployeeID, e.Title, EmployeeLevel + 1
    FROM dbo.MyEmployees AS e
        INNER JOIN DirectReports AS d
        ON e.ManagerID = d.EmployeeID 
)

Lägg till något liknande i kolumnen EmployeeLevel till din CTE, så borde allt fungera.



  1. Finns det en databasmotor som tillåter frågebara fältbegränsningar specificerade av RegEx?

  2. mysql:Hur man INNER JOIN ett bord men begränsar gå med till 1 resultat med den högsta rösten eller antalet?

  3. Ändra tabell, lägg till kolumn / ORA-00984:kolumn inte tillåten här PLSQL

  4. Kan ett bord ha flera primärnycklar?