Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 8 sur 8
  1. #1
    Nouveau Membre du Club
    Profil pro
    Développeur Java
    Inscrit en
    août 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 27
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : août 2008
    Messages : 176
    Points : 38
    Points
    38

    Par défaut Identificateur non valide dans une requête imbriquée

    Bonjour,
    j'ai un problème au niveau d'une requête d'update massive, la requête et de la forme:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
     
    UPDATE myTable T_ SET column1 = 
    (SELECT * FROM (
         SELECT ( x FROM otherTable T2_ 
                      WHERE T2_.col1 = T_.col
                      ORDER BY T2_.col2 DESC
                   ) WHERE rownum = 1
    )
    le problème c'est que oracle ne reconnait pas la colonne T_.col dans la deuxième select

    Des idées pour résoudre ce problème?

    Merci d'avance

  2. #2
    Expert Confirmé

    Homme Profil pro Florent SIEBERT
    Administrateur de base de données
    Inscrit en
    juin 2012
    Messages
    612
    Détails du profil
    Informations personnelles :
    Nom : Homme Florent SIEBERT
    Âge : 25
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : juin 2012
    Messages : 612
    Points : 2 777
    Points
    2 777

    Par défaut

    Bonjour,

    Votre requête est syntaxiquement incorrecte, commencez par donner la vraie requête.

  3. #3
    Nouveau Membre du Club
    Profil pro
    Développeur Java
    Inscrit en
    août 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 27
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : août 2008
    Messages : 176
    Points : 38
    Points
    38

    Par défaut

    Citation Envoyé par FSiebert Voir le message
    Bonjour,

    Votre requête est syntaxiquement incorrecte, commencez par donner la vraie requête.
    La requete réel est un peu complexe j'ai essayé de la simplifier
    c'est quoi l'incorrecte dans cette requete
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    UPDATE Table1 T_ SET colonne1_ = 
    ( SELECT * FROM 
          ( SELECT T2_.col3 FROM otherTable T2_ 
              WHERE T2_.col1 = T_.col
              ORDER BY T2_.col2 DESC
           ) 
      WHERE rownum = 1
    )
    Merci d'avance

  4. #4
    Expert Confirmé

    Homme Profil pro Florent SIEBERT
    Administrateur de base de données
    Inscrit en
    juin 2012
    Messages
    612
    Détails du profil
    Informations personnelles :
    Nom : Homme Florent SIEBERT
    Âge : 25
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : juin 2012
    Messages : 612
    Points : 2 777
    Points
    2 777

    Par défaut

    Citation Envoyé par Sfaxiano Voir le message
    c'est quoi l'incorrecte dans cette requete
    À vous de nous le dire, quelle est votre erreur ?

  5. #5
    Nouveau Membre du Club
    Profil pro
    Développeur Java
    Inscrit en
    août 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 27
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : août 2008
    Messages : 176
    Points : 38
    Points
    38

    Par défaut

    Citation Envoyé par FSiebert Voir le message
    À vous de nous le dire, quelle est votre erreur ?
    Est ce que la modification en rouge résoud le problème
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE Table1 T_ SET colonne1_ = 
    ( SELECT * FROM 
          ( SELECT T2_.col3 FROM otherTable T2_ inner join Table1 T3_
              WHERE T2_.col1 = T3_.col
              ORDER BY T2_.col2 DESC
           ) 
      WHERE rownum = 1

  6. #6
    Expert Confirmé

    Homme Profil pro Florent SIEBERT
    Administrateur de base de données
    Inscrit en
    juin 2012
    Messages
    612
    Détails du profil
    Informations personnelles :
    Nom : Homme Florent SIEBERT
    Âge : 25
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : juin 2012
    Messages : 612
    Points : 2 777
    Points
    2 777

    Par défaut

    Citation Envoyé par Sfaxiano Voir le message
    Est ce que la modification en rouge résoud le problème
    Encore une fois, vous ne nous avez toujours pas dit quel est le problème...
    Avez-vous une erreur de syntaxe (si oui laquelle) ou est-ce que ça ne fait pas ce que vous voulez (dans ce cas que voulez-vous faire) ?

    Je vous invite à lire les règles !

  7. #7
    Expert Confirmé
    Inscrit en
    août 2008
    Messages
    2 145
    Détails du profil
    Informations forums :
    Inscription : août 2008
    Messages : 2 145
    Points : 3 744
    Points
    3 744

    Par défaut

    Utilise keep dense rank first/last pour éviter la sous-requête :
    Code :
    1
    2
    3
    4
    UPDATE myTable T_ 
       SET column1 = (SELECT max(x) keep (dense rank first ORDER BY T2_.col2 DESC)
                        FROM otherTable T2_ 
                       WHERE T2_.col1 = T_.col)
    Peut être couplé à MERGE pour les perfs :
    Code :
    1
    2
    3
    4
    5
    6
    7
    merge INTO myTable T_ 
    USING (SELECT col1, max(x) keep (dense rank first ORDER BY T2_.col2 DESC) AS max_x
             FROM otherTable T2_ 
            GROUP BY col1) u
       ON (u.col1 = T_.col)
     when matched then UPDATE
      SET t_column1 = u.max_x

  8. #8
    Nouveau Membre du Club
    Profil pro
    Développeur Java
    Inscrit en
    août 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 27
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : août 2008
    Messages : 176
    Points : 38
    Points
    38

    Par défaut

    Citation Envoyé par skuatamad Voir le message
    Utilise keep dense rank first/last pour éviter la sous-requête :
    Code :
    1
    2
    3
    4
    UPDATE myTable T_ 
       SET column1 = (SELECT max(x) keep (dense rank first ORDER BY T2_.col2 DESC)
                        FROM otherTable T2_ 
                       WHERE T2_.col1 = T_.col)
    Peut être couplé à MERGE pour les perfs :
    Code :
    1
    2
    3
    4
    5
    6
    7
    merge INTO myTable T_ 
    USING (SELECT col1, max(x) keep (dense rank first ORDER BY T2_.col2 DESC) AS max_x
             FROM otherTable T2_ 
            GROUP BY col1) u
       ON (u.col1 = T_.col)
     when matched then UPDATE
      SET t_column1 = u.max_x
    Merci ça résout le problème

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •