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

Requêtes MySQL Discussion :

Problème de syntaxe avec insert into et select


Sujet :

Requêtes MySQL

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    responsable testing
    Inscrit en
    janvier 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : responsable testing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : janvier 2022
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Problème de syntaxe avec insert into et select
    Bonjour,

    Je suis entrain d'importer un fichier .sql pour créer ma base de donnée.
    Malheureusement, j'ai une erreur lors de cet import sur de la syntaxe. J'ai beau retourner le tout dans ma tête, je ne vois pas le problème.
    J'espère qu'avec plusieurs têtes, mon problème sera un vieux souvenir.

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    create table TEMP_CLN_CONTENT_ORDER(
            CONTENT_ORDER BIGINT NOT NULL, 
            ANCESTOR_ID BIGINT NOT NULL, 
            DESCENDANT_ID BIGINT NOT NULL, 
            DUMMY BIGINT NOT NULL
          );
     
    insert into TEMP_CLN_CONTENT_ORDER (CONTENT_ORDER, ANCESTOR_ID, DESCENDANT_ID, DUMMY)
         select (
            if(@prevtcs=ANCESTOR_ID, @rownum:=@rownum+1, @rownum:=0) as RANK,
            clnr.ANCESTOR_ID, clnr.DESCENDANT_ID, (@prevtcs:=ANCESTOR_ID) )
          from ( 
          	select cr.ancestor_id, cr.descendant_id 
         	from CLN_RELATIONSHIP cr
            join CAMPAIGN_LIBRARY_NODE cln on cr.DESCENDANT_ID = cln.CLN_ID 
            order by cr.ANCESTOR_ID, cln.NAME
           ) as clnr,
            (SELECT @rownum:=0) r, 
            (SELECT @prevtcs:=0) s;
    Voici l'erreur :
    ERROR 1064 (42000) at line 3390: Erreur de syntaxe près de 'as rank,
    clnr.ANCESTOR_ID, clnr.DESCENDANT_ID, (@prevtcs:=ANCESTOR_ID) )' à la ligne 3
    Merci par avance.
    Amélie

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    mai 2002
    Messages
    8 915
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2002
    Messages : 8 915
    Points : 29 804
    Points
    29 804
    Par défaut
    Bonjour,

    Commence peut-être par enlever les parenthèses qui suivent le SELECT et précèdent le FROM (à la fin des lignes 9 et 11)
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    responsable testing
    Inscrit en
    janvier 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : responsable testing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : janvier 2022
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour votre retour.
    Malheureusement, cela ne change rien.

    Au départ, ces parenthèses n'y étaient pas. C'est une autre source qui pensait que cela pouvait avoir un impact.

    D'autres idées ?

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

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : janvier 2009
    Messages : 4 726
    Points : 11 359
    Points
    11 359
    Par défaut
    Je trouve qu'il y a un truc bizarre dans ton SELECT:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    select 
            if(@prevtcs=ANCESTOR_ID, @rownum:=@rownum+1, @rownum:=0) as RANK,
            clnr.ANCESTOR_ID, clnr.DESCENDANT_ID, (@prevtcs:=ANCESTOR_ID)
          from ( 
          	select cr.ancestor_id, cr.descendant_id 
         	from CLN_RELATIONSHIP cr
            join CAMPAIGN_LIBRARY_NODE cln on cr.DESCENDANT_ID = cln.CLN_ID 
            order by cr.ANCESTOR_ID, cln.NAME
           ) as clnr,
            (SELECT @rownum:=0) r, 
            (SELECT @prevtcs:=0) s;
    Si je résume, on a un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select c1,c2,c3,c4
    from (une sous requete),(une sous-requête), (une sous-requête), (une sous-requête)
    Les deux dernières sous-requête renvoie une valeur scalaire, il ne faut pas plutôt une table ?

    Une dernière idée: est-ce que ça ne fonctionne pas mieux sans les alias de colonne ? Il me semble qu'il ne faut pas en mettre dans le cas d'un INSERT INTO... SELECT.

    Tatayo.

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    février 2011
    Messages
    5 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : février 2011
    Messages : 5 256
    Points : 15 487
    Points
    15 487
    Par défaut
    Salut à tous.

    1) vous nommer une colonne "rank" alors que ce nom ne figure pas dans l'insert et encore moins dans la table "TEMP_CLN_CONTENT_ORDER".
    2) vous utilisez une forme d'écriture qui n'a plus cours avec les dernières versions de MySql.
    Pour résoudre ce problème, vous devez utiliser un déclencheur (trigger).

    La création de la table n'est pas complète.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DROP TABLE IF EXISTS `TEMP_CLN_CONTENT_ORDER`;
     
    CREATE TABLE `TEMP_CLN_CONTENT_ORDER`
    (  `content_order`   bigint unsigned NOT NULL auto_increment primary key,
       `ancestor_id`     bigint unsigned NOT NULL,
       `descendant_id`   bigint unsigned NOT NULL,
       `rank`            bigint unsigned NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_cs`
      ROW_FORMAT=COMPRESSED;
    Voici votre déclencheur qui va alimenter votre colonne "rank" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DROP TRIGGER IF EXISTS `increment`;
     
    DELIMITER $$
    CREATE TRIGGER `increment`
    BEFORE INSERT ON `TEMP_CLN_CONTENT_ORDER`
    FOR EACH ROW
    BEGIN
      SET NEW.rank=ifnull((select max(rank)+1 from `test` where ancestor_id=NEW.ancestor_id),1);
    END$$
    DELIMITER ;
    Et pour finir, l'insertion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    insert into `TEMP_CLN_CONTENT_ORDER` (`ANCESTOR_ID`, `DESCENDANT_ID`)
        select  cr.`ANCESTOR_ID`,
                cr.`DESCENDANT_ID`
          from  `CLN_RELATIONSHIP` as cr
    inner join  `CAMPAIGN_LIBRARY_NODE` as cln
            on  cr.`DESCENDANT_ID` = cln.`CLN_ID`;
    Il est inutile de mettre la colonne 'content_order' dans votre requête car il s'agit de la primary key et celle-ci sera renseigné par MySql.
    Idem pour la colonne 'rank' car elle sera gérée par le déclencheur.
    Comme vous le constatez, la requête est simplifiée.

    Cordialement.
    Artemus24.
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  6. #6
    Nouveau Candidat au Club
    Femme Profil pro
    responsable testing
    Inscrit en
    janvier 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : responsable testing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : janvier 2022
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup à Artemus24, tatayo et al1_24 pour le temps passé et les pistes. Je vais essayé de m'en dépatouiller.
    Mais malheureusement, mon niveau est largement dépassé. Je nage complétement.
    Ce code m'a été fourni pour la configuration de la base de donnée d'un logiciel gratuit. Mes connaissances en SQL sont complétement périmées.

    Merci encore.

Discussions similaires

  1. Problème de syntaxe avec INSERT INTO
    Par ImmoTPA dans le forum Requêtes
    Réponses: 1
    Dernier message: 27/11/2014, 10h48
  2. Problème avec INSERT INTO
    Par Armaklan dans le forum Oracle
    Réponses: 3
    Dernier message: 28/02/2007, 12h15
  3. Probleme avec INSERT INTO et select
    Par jmjmjm dans le forum Requêtes
    Réponses: 9
    Dernier message: 28/01/2007, 23h51
  4. Réponses: 12
    Dernier message: 25/11/2005, 13h29
  5. Réponses: 3
    Dernier message: 10/05/2005, 12h02

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