ORA-01446 - impossible de sélectionner ROWID de vue DISTINCTS, GROUPE, etc
J'ai créé un point de vue qui a un distinct dans la clause select.
Quand j'essaie de sélectionner tous les enregistrements "select * from view" j'obtiens l'erreur suivante:
ORA-01446: cannot select ROWID from view with DISTINCT, GROUP BY, etc.
J'étais à la recherche pourquoi cela se produit et est venu à ceci:
Vous avez essayé de créer une vue qui inclus un ROWID dans l'instruction SELECT, ainsi qu'une clause comme DISTINCTE ou un GROUPE PAR. Ce n'est pas autorisé. Référence
C'est étrange parce que l'sélectionnez stament dans la vue n'sélectionne le rowid et il n'est pas utilisé dans toute autre clause where, order, etc..)
Toute idée de ce?
Mise à jour
Je ne suis pas en mesure de publier la requête elle-même, mais je poste un look-a-like. Ici, il est:
SELECT DISTINCT t1.c1 TABLE1_C1,
t1.c2 TABLE1_C2,
t1.c3 TABLE1_C3,
t1.c4 TABLE1_C4,
t1.c4 TABLE1_C4,
t1.c5 TABLE1_C5,
t1.c6 TABLE1_C6,
t1.c7 TABLE1_C7,
t1.c8 TABLE1_C8,
t2.c1 TABLE2_C1,
t2.c2 TABLE2_C2,
t2.c3 TABLE2_C3,
t2.c4 TABLE2_C4,
t2.c5 TABLE2_C5,
t3.c1 TABLE3_C1,
t2.c6 TABLE2_C6,
t4.c1 TABLE4_C1,
t4.c2 TABLE4_C2,
t4.c3 TABLE4_C3
FROM table1 t1
LEFT JOIN table2 t2
ON t1.c1 = t2.c7
left JOIN table4 t4
ON t4.c4 = t2.c1
LEFT JOIN table3 t3
ON (t2.c1 = t3.c2
AND t2.c8 = t3.c3
AND t2.c9 = t3.c4)
WHERE (t2.cp5 = 0 or t2.cp5 is null)
AND (t2.c3 =
(SELECT MAX(c3)
FROM table2 s_t2
WHERE s_t2.c3 LIKE t2.c3
AND s_t2.c7 = t1.c1
) or t2.c3 is null)
Quel langage/ framework/ application utilisez-vous pour l'exécution de la requête? Il est relativement fréquent qu'une bibliothèque pour essayer d'ajouter un
ROWID
à la SELECT
déclaration de transparence pour s'assurer qu'il n'y est une clé unique pour chaque ligne du résultat. Normalement, toutefois, la bibliothèque de gérer le cas que ROWID
ne peut être valablement ajouté à la requête avec plus de grâce, cependant.Dans le code (java, jdbc6) toutes les requêtes à la vue fonctionnent parfaitement (aussi parce que je ne suis pas en utilisant * dans une requête). Cette erreur est dans SQLDeveloper. Peut-être que le "problème" est que, il essaie de sélectionner l'id de ligne de manière transparente...
Je ne suis pas en mesure de publier la requête elle-même, mais je peux poster un look-a-like
Que ça vous aidera
OriginalL'auteur Miguel Ribeiro | 2012-03-21
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez distincte ou un groupe de plusieurs lignes peut qualifier l'état. Si différentes exécutions, de retour différent de l'id de ligne et l'autre question si plusieurs lignes qualifier, laquelle aimeriez-vous revenir?
Cela ne veut tout simplement pas de bon sens
OriginalL'auteur steve
Pas sûr de ce que l'OP a été fait puisqu'il n'est pas ROWID dans la requête. Mais cela peut vous aider, il suffit d'ajouter un alias de colonne:
OriginalL'auteur Tom Warfield
Une autre possibilité: juste après Avoir subi cette erreur depuis 3 jours, j'ai une autre combinaison d'options qui pourraient être en cause.
Vous pouvez obtenir l'erreur Oracle:
ORA-01445: impossible de sélectionner ROWID de, ou de l'échantillon, une jointure vue sans clé-conserves de table
Nous avons finalement découvert que 2 des tables dans une requête importante avait cette option activée, et le jetait cette erreur. L'autorisation avait été accordée à notre schéma de ces deux tables.
Il a fallu si longtemps pour déterminer ce fut la cause car 1) les tables sont détenues par une autre équipe, et 2) les tableaux qui avait accordé la REQUÊTE de RÉÉCRIRE la permission de notre schéma, mais la requête (compilé dans un travail quotidien) n'a pas manqué jusqu'à 3 semaines plus tard, après une mise à jour du système.
L'équipe qui a accordé ce droit n'a pas révoqué, mais le problème persiste. Donc, notre travail à court terme-pour le travail quotidien consiste à ajouter les éléments suivants à l'action:
Des Questions de suivi, nous avons:
Nous sommes encore à méditer sur la façon de forcer l'optimiseur de ré-analyser la requête de reconnaître que nous n'avons plus de cette subvention, mais il pourrait prendre un redémarrage du système.
Bien que je reconnaisse une vue matérialisée produit une table physique, je suis
aussi me demandant encore pourquoi une table qui ne fait pas partie d'un mview
serait accordé ce droit.
OriginalL'auteur StewS2