IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Requête d'insertion et plusieurs SELECT imbriqués, est-ce possible?


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Développement
    Inscrit en
    Février 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développement
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2016
    Messages : 55
    Points : 38
    Points
    38
    Par défaut Requête d'insertion et plusieurs SELECT imbriqués, est-ce possible?
    ----VOIR LE DERNIER MESSAGE-----RÉSOLU

    Bonjour,

    est-il possible de faire plusieurs Select imbriqués dans une requête d'insertion? Peut-on faire un inner join au lieu d'utiliser plusieurs SELECT?

    Suite à la discussion, voici ce que j'ai essayé avec trois SELECT imbriqués:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     Dim requeteAjouterDessin = "INSERT INTO BANQUE(Client_Id, Application_Id, Technologie_Id) " & _
                                            "SELECT DISTINCT (SELECT DISTINCT (SELECT DISTINCT Client_Id FROM CLIENTS WHERE CLIENT = '" _
                                              & Me.cmbNomClientAjouterDonnee.Text & "'), Technologie_Id FROM TECHNOLOGIE WHERE Description_Anglaise LIKE '" _
                                              & Me.cmbTechnologieAjouterDonnee.Text & "'), Application_Id FROM APPLICATION WHERE Description_Anglaise = '" _
                                              & Me.cmbApplicationAjouterDonnee.Text & "'"
     
     
      cmd = New OleDb.OleDbCommand(requeteAjouterDessin, connexionOleDb)
     
            cmd.Parameters.AddWithValue("Val_Application", cmbApplicationAjouterDonnee.Text)
            cmd.Parameters.AddWithValue("Val_NomClient", cmbNomClientAjouterDonnee.Text)
            cmd.Parameters.AddWithValue("Val_Technologie", cmbTechnologieAjouterDonnee.Text)
    La requête ci-dessus n'a pas fonctionné. Avec deux SELECT c'est okay, sinon ça ne fonctionne pas.

    Merci,

    Alex.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Bonjour,
    Pour commencer, "ça ne fonctionne pas" est très insuffisant. Il nous faut au minimum le message d'erreur pour savoir "ce qui ne fonctionne pas"...
    Cela étant dit, la requête pique les yeux:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    INSERT INTO BANQUE(Client_Id, Application_Id, Technologie_Id) 
    SELECT DISTINCT (
    SELECT DISTINCT (
    SELECT DISTINCT Client_Id FROM CLIENTS WHERE CLIENT = 'XXX'),
     Technologie_Id FROM TECHNOLOGIE WHERE Description_Anglaise LIKE 'YYY'),
     Application_Id FROM APPLICATION WHERE Description_Anglaise = 'ZZZ'
    Ici, tu fais un produit cartésien entre les 3 sous-requêtes... Est-ce voulu ?
    il me semble aussi que Application_Id et Technologie_id sont inversés entre ce qu'attend l'INSERT et ce qui est renvoyé par la requête (enfin ce que j'en comprend).
    Si je réécris la requête, ça donne ceci:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    INSERT INTO BANQUE(Client_Id, Application_Id, Technologie_Id) 
    SELECT DISTINCT CLIENTS.Client_Id,APPLICATION.Application_Id,TECHNOLOGIE.Technologie_id
    FROM CLIENTS 
    INNER JOIN TECHNOLOGIE ON ???
    INNER JOIN APPLICATION ON ???
    WHERE
    CLIENT = 'XXX' AND Description_Anglaise LIKE 'YYY' AND Description_Anglaise = 'ZZZ'
    Les ??? doivent être remplacés par les conditions qui lient les tables client, technologies et application.

    Tatayo.

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Outre les remarques judicieuses de Tatayo, j'ajoute que la bonne démarche pour ce type de requête est de commencer par exécuter la partie select seule pour s'assurer de son bon fonctionnement d'une part, et de la conformité de l'ensemble construit par rapport au besoin d'autre part.

    Ca évite d'insérer à l'aveugle des données non maitrisées

    Il semble que vous ayez ouverts 2 fois le même sujet :http://www.developpez.net/forums/d15...e/#post8551320

  4. #4
    Nouveau membre du Club
    Femme Profil pro
    Développement
    Inscrit en
    Février 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développement
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2016
    Messages : 55
    Points : 38
    Points
    38
    Par défaut
    Bonjour,

    tout d'abord, merci pour votre aide. Le code ci-haut ne correspond pas à ce que je veux faire. Voici ma requête initiale, mon raisonnement et l'erreur obtenue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            ' Dim requeteAjouterDessinAutocad = "INSERT INTO BANQUE(Application_Id, Technologie_Id) VALUES ((SELECT Application_Id FROM APPLICATION WHERE Description_Anglaise LIKE '" & Me.cmbApplicationAjouterDonnee.Text & "'),(SELECT Technologie_Id FROM TECHNOLOGIE WHERE Description_Anglaise LIKE '" & Me.cmbTechnologieAjouterDonnee.Text & "'))"
    Mon raisonnement: Insérer dans les colonnes Application_Id et Technologie_Id de ma table BANQUE l'Id de l'application pour lequel la description correspond à ce que l'utilisateur a choisie dans le combobox Application et l'Id de la technologie pour lequel la description correspond à ce que l'utilisateur a choisie dans le combox Technologie.

    Enfin, j'obtiens cette erreur :
    Une exception non gérée du type 'System.Data.OleDb.OleDbException' s'est produite dans System.Data.dll
    Informations supplémentaires*: Query input must contain at least one table or query.


    Merci pour votre aide, c'est très apprécié.

    Alex.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Dans mes applications, quand je propose une combo, une liste de valeurs... qui font référence à une table, je mets toujours l'id dans la combo/liste (quitte à la masquer) pour gérer ce genre de cas.
    Si ce n'est pas possible ici, il y a moyen de contourner (mais je ne trouve pas que ce soit très propre):
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    insert into Table1(Col1,col2)
    select t2.id,t3.id
    from Table2 as t2
    inner join Table3 on true as t3
    where t2.colx = 'XX' and t3.coly = 'YY'
    Si les colonnes colx et coly ne sont pas unique, plusieurs lignes sont insérées dans la table Table1...

    Tatayo.

  6. #6
    Nouveau membre du Club
    Femme Profil pro
    Développement
    Inscrit en
    Février 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développement
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2016
    Messages : 55
    Points : 38
    Points
    38
    Par défaut
    Merci encore pour l'aide.

    Voici ma nouvelle requête avec les ajustements que vous m'avez conseillés:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            Dim requeteAjouterDessinAutocad = "INSERT INTO BANQUE(Application_Id, Technologie_Id) SELECT APPLICATION.Application_Id ,TECHNOLOGIE.Technologie_Id FROM APPLICATION as table2 INNER JOIN TECHNOLOGIE ON TRUE AS table3 WHERE table2.Description_Anglaise = '" & Me.cmbApplicationAjouterDonnee.Text & "' and table3.Description_Anglaise = '" & Me.cmbTechnologieAjouterDonnee.Text & "'"
    Malheureusement, j'obtiens l'erreur suivante:

    Une exception non gérée du type 'System.Data.OleDb.OleDbException' s'est produite dans System.Data.dll
    Informations supplémentaires*: Syntax error (missing operator) in query expression 'TRUE AS table3'.

    De plus, je ne comprends pas bien l'utilisation de "on true" dans votre requête, à quoi sert cette déclaration ? Qu'est-ce qu'on veut vérifier avec la valeur vraie?.

    Enfin, quelque chose m'échappe avec la requête que j'ai écrite ci-dessous. En fait, celle-ci fonctionne parfaitement signifiant qu'une nouvelle ligne comportant l'id de mon application et de ma technologie s'ajoute dans ma base de donnée. Je me demande pourquoi je ne peux pas ajouter plus d'argument dans celle-ci ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim requeteAjouterDessinAutocad = "INSERT INTO BANQUE(Application_Id, Technologie_Id) " & _
               "SELECT (SELECT Application_Id FROM APPLICATION WHERE Description_Anglaise = '" _
               & Me.cmbApplicationAjouterDonnee.Text & "'), Technologie_Id FROM TECHNOLOGIE WHERE Description_Anglaise = '" _
              & Me.cmbTechnologieAjouterDonnee.Text & "'"
    Bref, puisque je n'étais pas capable de la modifier adéquatement et que de toute manière ça ne serait pas propre de la coder ainsi, j'ai décidé d'écrire la requête (non fonctionnelle) que je vous ai fait parvenir dans mon précédent message soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Dim requeteAjouterDessinAutocad = "INSERT INTO BANQUE(Application_Id, Technologie_Id) VALUES ((SELECT DISTINCT Application_Id FROM APPLICATION WHERE Description_Anglaise LIKE '" & Me.cmbApplicationAjouterDonnee.Text & "'),(SELECT DISTINCT Technologie_Id FROM TECHNOLOGIE WHERE Description_Anglaise LIKE '" & Me.cmbTechnologieAjouterDonnee.Text & "'))"
    Merci,

    Alex.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    La jointure est mal écrite, l'alias doit être spécifié avant la condition de jointure (mais je vois que c'est de ma faute ).
    J'ai utilisé ON TRUE avec une jointure externe pour faire ressortir le côté "pas beau" de cette solution.
    Un CROSS JOIN serait en fait plus indiqué ici:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    insert into Table1(Col1,col2)
    select t2.id,t3.id
    from Table2 as t2
    cross join Table3 as t3
    where t2.colx = 'XX' and t3.coly = 'YY'

    Je ne vois pas très bien à quoi sert le DISTINCT dans les clause SELECT. Si deux lignes de APPLICATIONS ont la même DESCRIPTION_ANGLAISE, la requête renvoie de toute façon deux lignes (et à mon avis plante joyeusement).
    Et pour comprendre ce qui ne va pas dans la deuxième requête, il faut en premier la sortir du code hôte, l'indenter correctement, et chercher les liens entre les SELECT et les FROM. L'erreur va sauter aux yeux.

    Tatayo.

  8. #8
    Nouveau membre du Club
    Femme Profil pro
    Développement
    Inscrit en
    Février 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développement
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2016
    Messages : 55
    Points : 38
    Points
    38
    Par défaut
    Finalement j'ai trouvé une requête fonctionnelle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Dim requeteAjouterDessinAutocad = "INSERT INTO TEST (Technologie_Id, Client_Id, Application_Id) SELECT Client_Id, (SELECT Technologie_Id FROM TECHNOLOGIE WHERE Description_Anglaise LIKE '" & Me.cmbTechnologieAjouterDonnee.Text & "') AS Technologie_Id, (SELECT Application_Id FROM APPLICATION WHERE Description_Anglaise LIKE '" & Me.cmbApplicationAjouterDonnee.Text & "') AS Application_Id FROM CLIENTS WHERE CLIENT LIKE '" & Me.cmbNomClientAjouterDonnee.Text & "'"
    Pour ceux qui se poserait la même question que moi, voici un lien intéressant :




    Merci encore pour ton aide tatayo et bonne journée,

    Alex.

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

Discussions similaires

  1. Requete INSERT avec plusieurs SELECT
    Par Tinkite82 dans le forum Requêtes
    Réponses: 4
    Dernier message: 01/09/2009, 17h30
  2. des DataTable imbriqués est ce possible?
    Par ezsoft dans le forum ASP.NET
    Réponses: 7
    Dernier message: 09/05/2009, 10h05
  3. [SQL] delete+insert ou plusieurs update c'est quoi le mieux?
    Par cassy dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 21/06/2006, 10h47
  4. Select case est-il possible dans ce cas ?
    Par rangernoir dans le forum Access
    Réponses: 10
    Dernier message: 30/09/2005, 16h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo