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 :

Erreur de Syntaxe sur une Requete UNION


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 699
    Par défaut Erreur de Syntaxe sur une Requete UNION
    Salut all,
    J'ai une erreur de requete et je vois pas pourquoi et comment la regler.
    La requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
                SELECT *, "T1" AS NomDeLaTable
                    FROM table1
                    WHERE MATCH (t1_nom, t1_adresse1, t1_adresse2, t1_adresse3, t1_cp, t1_ville, t1_email, t1_internet, t1_numero, t1_association, t1_equipe) AGAINST ("LaRecherche") 
                    AND t1_etat NOT IN (0, 99) 
     
                UNION ALL 
     
                SELECT *, "T2" AS NomDeLaTable
                    FROM table2
                    WHERE MATCH (t2_nom, t2_adresse1, t2_adresse2, t2_adresse3, t2_cp, t2_ville, NULL, NULL, NULL, NULL, NULL) AGAINST ("LaRecherche") 
                    AND t2_etat NOT IN (0, 99) 
     
                LIMIT 100;
    L'erreur
    La requête SQL a échouée
    1064-You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ’NULL, NULL, NULL, NULL, NULL) AGAINST ("LaRecherche") FROM table2' at line xxx
    Il apparait que ce soit les NULL (car les 2 tables n'ont pas le meme nombre de zones) mais de toutes mes recherches sur le sujet, il apparait que mon code soit pourtant correct.
    Une solution ou des idees ?
    Merci pour votre aide.

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 176
    Par défaut
    Bonjour,

    Je ne connais pas MySQL mais normalement dans un SELECT si tu choisis * avec d'autres colonnes, il faut indiquer le nom de la table ou son alias:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     SELECT table1.*, "T1" AS NomDeLaTable
                    FROM table1
    ...
      SELECT table2.*, "T2" AS NomDeLaTable
                    FROM table2
    ...
    Tu dis que table1 et table2 n'ont pas le même nombre de colonnes? Si c'est le cas alors ça ne peut pas fonctionner. Il faut que tu sélectionnes le même nombre de colonnes, et que celles-ci correspondent au même type de données d'une table à l'autre.

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 640
    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 640
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Non, ce n'est pas nécessaire.
    Vérifiez le nombre de colonnes respectif de chaque table et aussi, remplacez vos doubles quotes par de simples quotes.
    Les doubles quotes, en SQL normé, servent à encadrer les noms d'objets quand ce sont des noms réservés (dans MySQL c'est la quote inverse qui est utilisée)
    Les simples quotes servent à encadrer les chaînes de caractères.

    Exemple testé avec MySQL 5.7 et qui fonctionne :

    Code SQL : 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
    20
    21
    22
    23
    create table T1( C1 integer not null auto_increment primary key
                   , C2 char(4) not null)
           engine=innodb
    ;
    create table TA( CA integer not null auto_increment primary key
                   , CB char(4) not null
                   , CC char(6) not null)
           engine=innodb
    ;
    insert into T1(C2) values ('ABCD'), ('EFGH'), ('XCVB')
    ;
    insert into TA(CB, CC) 
           values ('ABCD', 'test 1')
                , ('ABCD', 'test 2')
                , ('EFGH', 'test 3')
                , ('XCVB', 'test 4')
                , ('XCVB', 'test 5')
                , ('XCVB', 'test 6')           
    ;
    select *, 'XX', 'T1' as nomtable from T1
    union all
    select *, 'TA' as nomtable from TA
    ;


    Résultat :
    C1 C2 XX nomtable
    1 ABCD XX T1
    2 EFGH XX T1
    3 XCVB XX T1
    1 ABCD test 1 TA
    2 ABCD test 2 TA
    3 EFGH test 3 TA
    4 XCVB test 4 TA
    5 XCVB test 5 TA
    6 XCVB test 6 TA

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 010
    Billets dans le blog
    6
    Par défaut
    Vous devez virer vos NULL qui n'ont aucun sens dans l'opérateur MATCH. En effet cet opérateur attend des identifiants SQL (nom de colonne en particulier). Or aucun identifiant SQL ne saurait être NULL !

    Pour la syntaxe, lisez le manuel : https://dev.mysql.com/doc/refman/8.0...-language.html

    D'autre part, comme dit par mon confrère, les chaines de caractères s'entourent d'apostrophe (en anglais simple quote) pas de guillemets (double quote).

    Bref, apprenez le langage SQL et le dialecte propre à MySQL.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre Expert Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 699
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Vous devez virer vos NULL qui n'ont aucun sens dans l'opérateur MATCH. En effet cet opérateur attend des identifiants SQL (nom de colonne en particulier). Or aucun identifiant SQL ne saurait être NULL !
    Ok je comprends cela, mais il me faut le meme nombre de colonnes (ce qui n'est pas le cas)
    ...
    hmmm je crois que j'ai compris, il faut que je donne des noms de colonnes (meme si elles existent pas) en leur assignant la valeur Null. (NULL AS t2.xxx) C'est ca ?

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 640
    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 640
    Billets dans le blog
    10
    Par défaut
    C'est ça.

    Par contre "null" n'est pas une valeur, c'est tout le contraire, c'est un marqueur d'absence de valeur

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 010
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Danyel Voir le message
    Ok je comprends cela
    Non, visiblement pas compris !

    , mais il me faut le meme nombre de colonnes (ce qui n'est pas le cas)
    Non, pas du tout !

    C'est dans la clause SELECT qu'il faut mettre le même nombre de colonne et que chaque paire de colonne doit être d'un type compatible. Pas dans le MATCH AGINST (encore une syntaxe de merde anormative de MySQL qui embrouille tout !)

    ...
    hmmm je crois que j'ai compris, il faut que je donne des noms de colonnes (meme si elles existent pas) en leur assignant la valeur Null. (NULL AS t2.xxx) C'est ca ?
    Non plus

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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

Discussions similaires

  1. Erreur de syntaxe sur une requete :(
    Par niamo dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 08/06/2010, 12h08
  2. Erreur de syntaxe sur une Requete Update
    Par samtheh dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 01/06/2007, 13h07
  3. [SQL] erreur de syntaxe dans une requete
    Par einsteineuzzz dans le forum PHP & Base de données
    Réponses: 17
    Dernier message: 15/06/2006, 09h24
  4. Erreur de syntaxe sur une requête paramétrée
    Par deglingo37 dans le forum Access
    Réponses: 5
    Dernier message: 16/05/2006, 22h21
  5. Erreur de syntaxe dans une requete
    Par linou dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/08/2005, 12h44

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