2009-10-16 16 views
1

Pourquoi cela ne fonctionne-t-il pas?Conditions WHERE dans la sous-requête lors de l'utilisation des jointures ANSI

SELECT a.* 
FROM dual a 
    JOIN (SELECT * FROM dual WHERE 1=1) b 
    ON (1=1); 

Je reçois "ORA-00900: instruction SQL non valide". Existe-t-il un moyen d'utiliser la clause WHERE dans la sous-requête?

Edit: Version 9,2

SELECT * 
FROM v$version 

Oracle9i Enterprise Edition de presse 9.2.0.8.0 - 64bit production

Les suivants se exécute très bien:

SELECT a.* 
FROM dual a 
    JOIN (SELECT * FROM dual /*WHERE 1=1*/) b 
    ON (1=1) 
+1

Quelle version d'Oracle? Je viens d'essayer cette requête sur Oracle 10g et cela fonctionne. – zendar

Répondre

1

Il fonctionne pour moi sur 9.2 (version 32 bits est la seule différence):

SQL> SELECT a.* 
    2 FROM dual a 
    3  JOIN (SELECT * FROM dual WHERE 1=1) b 
    4  ON (1=1); 

D 
- 
X 

SQL> quit 
Disconnected from Oracle9i Enterprise Edition Release 9.2.0.8.0 - Production 
With the OLAP and Oracle Data Mining options 
JServer Release 9.2.0.8.0 - Production 
+0

C'est ce qui a résolu mon problème. Il s'avère que c'était un bug dans SQL Navigator. Fonctionne très bien dans SQL * Plus. – jva

1

Quelle version utilisez-vous?

Le même SQL fonctionne très bien pour moi (base de données Oracle 10g Express Edition 10.2.0.1.0).

0

Cela me semble correct et je suis capable de l'exécuter en 10g, mais il échoue avec 8i, quelle version d'Oracle utilisez-vous?

1

Oracle au-dessous de 9i ne prend pas en charge la syntaxe de jointure ANSI.

Utilisez cette option si vous êtes sur 8i et ci-dessous:

SELECT a.* 
FROM dual a, 
     (
     SELECT * 
     FROM dual 
     WHERE 1 = 1 
     ) b 
WHERE 1 = 1 
+0

J'ai modifié la question pour montrer que ma version (9.2) supporte les jointures ANSI mais pas celle-ci en particulier. – jva