2010-09-05 5 views
3

Ce que je suis en train d'atteindre est d'obtenir les lignes ayant la valeur maximale d'une table de la forme suivante:Comment puis-je utiliser un alias dans une sous-requête?

A | B | Ratio 
0 | 1 | 1.0 
1 | 2 | 1.0 
2 | 3 | 1.0 
3 | 4 | 0.33 
4 | 5 | 0.25 

Je suis en train d'afficher uniquement les lignes contenant la valeur maximale (dans ce cas 1.0). Peut-être que je ne fais pas bien. J'ai une question de la forme:

SELECT A,B,C 
FROM (---Long Sub Query--- Aliased as Full_Table) 
WHERE RATIO=(SELECT MAX(RATIO) FROM Full_Table); 

Mais Full_Table ne peut pas être extraites de la deuxième sous-requête. Certaines lignes ont la même valeur maximale, ce qui explique pourquoi j'utilise cette requête. Y a-t-il une meilleure construction pour y parvenir? Dans le pire des cas, je dois remplacer le second Full_Table par l'ensemble de la longue requête, mais j'espère qu'il y aura une meilleure façon de le faire.

Répondre

5

Vous pouvez utiliser une expression de table commune:

WITH Full_Table AS (---Long Sub Query---) 
SELECT A,B,C 
FROM Full_Table 
WHERE RATIO=(SELECT MAX(RATIO) FROM Full_Table); 
+0

Belle ..! Merci beaucoup :) – Legend

2

Utilisation:

SELECT full_table.a, 
     full_table.b, 
     full_table.c 
    FROM (SELECT ..., 
       RANK() OVER (ORDER BY ratio DESC) AS rank 
      FROM Sub Query---) full_table 
WHERE full_table.rank = 1 

On ne sait pas s'il peut y avoir plus d'un enregistrement retourné, alors j'ai utilisé RANK() plutôt que ROW_NUMBER() parce ROW_NUMBER ne retournerait qu'un seul enregistrement.

Vous pouvez incorporer dans une clause WITH, mais il est encore une passe sur la table dérivée/vue en ligne vs vos deux passes ...

Oracle 9i + prend en charge la syntaxe WITH, appelant « sous-requête Factoring ». Ceux qui proviennent de SQL Server 2005+ connaissent la syntaxe WITH en tant qu'expression de table commune (CTE). Récursive - Oracle a seulement ajouté récursivité avec le support (maintenant qu'il est ANSI) dans 11g R2, en partie grâce à Oracle supportant la fonctionnalité récursive avec la syntaxe CONNECT BY (supportée depuis) Oracle v2). WITH La syntaxe est du sucre syntaxique pour les tables/vues en ligne dérivées - le plan de requête n'est pas réutilisé pour chaque instance.

WITH full_table AS (
    SELECT...) 
SELECT x.a, x.b, x.c 
    FROM full_table x 
    JOIN (SELECT MAX(t.ratio) AS max_ratio 
      FROM full_table t) y ON y.max_ratio = x.ratio 

... est l'identique à l'utilisation:

SELECT x.a, x.b, x.c 
    FROM (SELECT ...) x 
    JOIN (SELECT MAX(t.ratio) AS max_ratio 
      FROM (SELECT ...) t) y ON y.max_ratio = x.ratio 
Questions connexes