2011-03-18 4 views
0

J'essaie de limiter le nombre de lignes qui seraient affichées lors de l'exécution de ma requête. Quand je lance le code ci-dessous dans SQL Developer, il renvoie l'erreur manquant parenthèse fermante ..Oracle sql parenthèse droite manquante

select * from 
(select row_number() over (order by rescode) rnum, a.* from 
    ( 
    SELECT * 
    FROM trans z 
    LEFT JOIN emails a 
    ON z.email1_hist_id=a.email_id 
    or z.email2_hist_id=a.email_id 
    ) a 
) where rnum between 1 and 50; 

J'ai essayé d'exécuter la requête à l'intérieur:

SELECT * 
FROM trans z 
LEFT JOIN emails a 
ON z.email1_hist_id=a.email_id 
or z.email2_hist_id=a.email_id 

et il fonctionne très bien. D'un autre côté, j'ai essayé de supprimer la partie OU de ma requête et j'ai inclus la requête de lignes de limite et elle renvoie le nombre de lignes que j'ai spécifié.

Qu'est-ce qui ne va pas dans mon code?

+0

Je voudrais aussi essayer la partie qui commence par 'select row_number()' et se termine par ') a'. Quoi qu'il en soit, l'erreur semble stupide. Ce peut être probablement l'arrangement particulier de certains éléments de votre requête qui provoque l'erreur. Personnellement j'essaierais ceux-ci (un par un ou en combinaisons): mettre 'a. *' Avant 'row_number() ...'; en laissant le '(' avant 'select row_number() ...' sur une ligne séparée, en laissant le ')' devant 'where rnum ...' sur une ligne séparée; inversement, placer 'SELECT *' du select le plus interne sur la même ligne que le précédent '('; fusionne de la même façon les lignes de ') a' et') où rnum ... '. –

Répondre

0

Ma meilleure estimation est qu'il n'aime pas que vous donniez un alias à la sous-sélection, donc il lance l'erreur de syntaxe au "a" dans ") a)".

0

Je ne me souviens pas d'Oracle, mais je sais que MySQL nécessite réellement des sous-sélections pour avoir un alias. J'essayerais d'en ajouter un à votre sous-sélection externe (avant le rnum ...).

+0

J'ai essayé. select * from (sélectionnez row_number() sur (commande par reservation_code) de rnum, b * de (\t \t SELECT * FROM trans z \t LEFT JOIN un \t emails ON z.email1_hist_id = a .email_id \t ou z.email2_hist_id = a.email_id \t) b ) c où rnum entre 51 et 100; mais je reçois toujours l'erreur de parenthèse droite manquante ... :( – Mitch

1

Cela devrait fonctionner - vous n'avez pas besoin de deux niveaux de sous-requête

select * 
from 
( SELECT *, row_number() over (order by rescode) rnum 
    FROM trans z 
    LEFT JOIN emails a 
    ON (z.email1_hist_id=a.email_id or z.email2_hist_id=a.email_id) 
) x 
where rnum between 1 and 50; 

Aussi, assurez-vous qu'il n'y a pas de noms de colonnes en double entre trans et emails - cela déclenche la requête parce que * de la requête interne ne peut pas retourner les noms en double.

Questions connexes