sql >> Databasteknik >  >> RDS >> Oracle

Visa kräver ömsesidigt beroende logik:Möjligt utan MODELL?

Du kan använda rekursiv subquery factoring (även känd som en rekursiv CTE):

with tmp as (
  select t.*,
    row_number() over (order by t.id) as rn
  from t
),
r (id, n, x, y, rn) as (
  select id, n, 0, 0, rn
  from tmp
  where rn = 1
  union all
  select tmp.id, tmp.n, r.y - 1, (tmp.n * 2) + r.y - 1, tmp.rn
  from r
  join tmp on tmp.rn = r.rn + 1
)
select id, n, x, y
from r
order by rn;

        ID          N          X          Y
---------- ---------- ---------- ----------
         2          0          0          0 
         3          1         -1          1 
         5          1          0          2 
         7          2          1          5 
        11          3          4         10 
        13          5          9         19 
        17          8         18         34 
        19         13         33         59 

SQL Fiddle .

Det är i princip att gå igenom dina manuella steg. Ankarelementet är ditt första manuella steg, inställning x och y båda till noll för den första raden. Den rekursiva medlemmen gör sedan beräkningen du angav. (Du kan inte referera till den nyberäknade x värde vid beräkning av den radens y , så du måste upprepa det som (tmp.n * 2) + r.y - 1 ). rn är bara att behålla radernas ordning efter ID samtidigt som det gör det lättare att hitta nästa rad - så att du kan leta efter rn + 1 istället för att hitta det näst högsta ID-värdet direkt.

Det finns ingen signifikant prestandaskillnad med dina exempeldata, men med tusen rader tillagda tar modellsatsen cirka 5 sekunder och den rekursiva CTE tar cirka 1 sekund; med ytterligare tusen rader tar modellen ~20 sekunder och CTE tar ~3 sekunder; med ytterligare tusen rader tog modellen ~40 sekunder och CTE tog ~6 sekunder; och med ytterligare tusen rader (alltså 4 008 totalt) tog modellen ~75 sekunder och CTE tog ~10 sekunder. (Jag blev uttråkad av att vänta på modellversionen med fler rader än så; dödade den efter fem minuter med 10 000). Jag kan inte riktigt säga hur detta kommer att fungera med din riktiga data, men utifrån det är det förmodligen värt att försöka.




  1. Problemet med fönsterfunktioner och vyer

  2. Hur ställer du in schemanamnet för sekvenser vid driftsättning när du använder JPA?

  3. Problem på WSO2 med Oracle RDS Amazon-integration

  4. Ta bort duplicerad kolumn efter SQL-fråga