2009-08-04 8 views
1

Quelles sont les différences entre les deux requêtes suivantes? Les deux lignes différentes retourne:Différences entre deux requêtes analytiques

with ordered_table as 
(
select * from table order by column1 
) 
select first_value(column2 ignore nulls) over (partition by column3) 
from ordered_table; 

et

select first_value(column2 ignore nulls) over (partition by column3 order by column1) 
from table; 

Note: Je vais essayer de fournir un test cas mais je pense que pour quelqu'un ayant les concepts clairs ne sont pas nécessaires.

Répondre

0
WITH ordered_table AS 
     (
     SELECT * 
     FROM table 
     ORDER BY 
       column1 
     ) 
SELECT FIRST_VALUE(column2 IGNORE NULLS) OVER (PARTITION BY column3) 
FROM ordered_table 

Cette requête renverra la première par partition valeur de column2 sans ordre particulier (i. E. La CBO est libre de choisir toute ordonnance qu'il estime le meilleur).

SELECT FIRST_VALUE(column2 IGNORE NULLS) OVER (PARTITION BY column3 ORDER BY column1) 
FROM table; 

Cette requête renverra la première valeur par partition de column2, avec des partitions commandées par column1.

Depuis SQL langue fonctionne sur des ensembles, et votre article ORDER BY ne fait rien avec le jeu retourné dans le CTE, Oracle ne tient pas seulement la partie ORDER BY.

CBO peut choisir de se matérialiser, hachage ou de toute autre manière mutiler le CTE avant qu'il ne soit utilisé par la requête externe, de sorte que le ORDER BY utilisé dans le CTE sera perdu pour la requête externe.

0

La commande par column1 ne fait vraiment rien dans la première requête.

Il crée un ensemble de résultats dans l'ordre, mais je ne pense pas que cela porte dans votre déclaration de partition. La commande appartient à la clause de partition réelle.

0

La première version ordonne la ligne entière définie par colonne1, puis la partitionne par colonne3 et effectue le calcul analytique. Notez que la commande initiale par column1 n'est pas nécessairement conservée à travers le partitionnement - ce qui je pense est ce qui vous pend probablement.

La deuxième version partitionne les données par colonne3, puis les trie dans chaque partition par colonne1, puis détermine la sortie analytique.

Questions connexes