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

Développement SQL Server Discussion :

L'identificateur en plusieurs parties ne peut être lié (#4104)


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2015
    Messages : 80
    Points : 45
    Points
    45
    Par défaut L'identificateur en plusieurs parties ne peut être lié (#4104)
    Bonjour,

    J'obtiens cette erreur sans trop savoir pourquoi. Voici la situation :

    Nous avons une application Front-end sous Access 2003 utilisant des tables liées d'un SQL Server 2008 R2.

    Nous avons une table Vehicule(immat, secteur) et une table Vehicule_suivi_km(immat, date, km). Les véhicules de l'agence sont stockés dans la table Vehicule tandis que leurs relevés kilométriques sont stockés dans Vehicule_suivi_km. Dans Vehicule, immat est la clé primaire. Dans Vehicule_suivi_km, la clé primaire est immat + date.

    Je dois maintenant dresser un bilan des km parcourus à l'année. J'ai donc fais comme ceci :

    Création d'une requête [MO km max 2016] :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Vehicule.immat, vsk2016.date, vsk2016.km
    FROM Vehicule INNER JOIN Vehicule_suivi_km AS vsk2016 ON Vehicule.immat=vsk2016.immat
    WHERE (((vsk2016.date)=(SELECT Max(date) FROM Vehicule_suivi_km WHERE (Vehicule_suivi_km.date<#01/01/17# And Vehicule_suivi_km.immat=vsk2016.immat))))
    ORDER BY Vehicule.immat;
    Ce code me renvoi donc une ligne par véhicule contenant son relevé kilomètrique le plus récent avant le 1er janvier 2017.

    Je fais ensuite pareil pour les kilomètres de 2017 [MO km max 2017] :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Vehicule.immat, vsk2017.date, vsk2017.km
    FROM Vehicule INNER JOIN Vehicule_suivi_km AS vsk2017 ON Vehicule.immat=vsk2017.immat
    WHERE (((vsk2017.date)=(SELECT Max(date) FROM Vehicule_suivi_km WHERE (Vehicule_suivi_km.date<#01/01/18# And Vehicule_suivi_km.immat=vsk2017.immat))))
    ORDER BY Vehicule.immat;
    Maintenant je souhaite créer une requête qui joint ces deux tables en soustrayant les kilomètres de 2016 à ceux de 2017 [MO km cette année] :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT [MO km max 2017].immat, [MO km max 2017].km-Nz([MO km max 2016].km,0) AS km
    FROM [MO km max 2017] LEFT JOIN [MO km max 2016] ON [MO km max 2017].immat = [MO km max 2016].immat;
    Je fais un left join car il est possible que nous ayons achetés des véhicules depuis le 01/01/2017. Le Nz est donc là pour remplacer les valeurs null renvoyées par le left join avec des 0.

    J'obtiens alors l'erreur suivante de SQL Server mise en forme par Access :

    Nom : erreur_access_4104.PNG
Affichages : 7992
Taille : 8,4 Ko

    Je ne comprend pas d'où vient cette erreur. Si je transforme le left join en inner join elle disparaît.

    Est-ce un problème de clé primaire ou autre ? Quelqu'un pourrait-il m'éclairer sur le sujet ?

    Merci de votre attention.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    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 : 21 768
    Points : 52 571
    Points
    52 571
    Billets dans le blog
    5
    Par défaut
    Commencez par apprendre le langage SQL !

    Voici votre bouliboulga retraduit en requête SQL :

    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
    20
    21
    22
    23
    WITH
    [MO km max 2016] AS 
    (
    SELECT Vehicule.immat, vsk2016.date, vsk2016.km
    FROM   Vehicule 
           INNER JOIN Vehicule_suivi_km AS vsk2016 
                 ON Vehicule.immat=vsk2016.immat
                 AND Vehicule_suivi_km.immat=vsk2016.immat
    WHERE  vsk2016.date = (SELECT Max(date) FROM Vehicule_suivi_km WHERE Vehicule_suivi_km.date< '2017-01-01' )
    ),
    [MO km max 2017] AS
    (
    SELECT Vehicule.immat, vsk2017.date, vsk2017.km
    FROM   Vehicule 
           INNER JOIN Vehicule_suivi_km AS vsk2017 
                  ON Vehicule.immat=vsk2017.immat 
                  AND Vehicule_suivi_km.immat=vsk2017.immat
    WHERE vsk2017.date = (SELECT Max(date) FROM Vehicule_suivi_km WHERE Vehicule_suivi_km.date< '2018-01-01' )
    )
    SELECT [MO km max 2017].immat, [MO km max 2017].km-COALESCE([MO km max 2016].km,0) AS km
    FROM [MO km max 2017]  
         LEFT OUTER JOIN [MO km max 2016] 
              ON [MO km max 2017].immat = [MO km max 2016].immat;
    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/ * * * * *

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2015
    Messages : 80
    Points : 45
    Points
    45
    Par défaut
    Bonjour monsieur.

    Sachez tout d'abord que je suis un peu déçu de ce manque de politesse de votre part. En effet les 2 premières requêtes viennent de mon prédécesseur dans mon agence qui m'avait fait l'éloge du fameux "SQLpro" de developpez.net, de ses tutos et multiples conseils en SQL sur le net. Il ne m'avait apparemment pas parlé de cette facette de votre personne.

    Je n'ai fait que reprendre ses requêtes de 2014 en remplaçant le 14 par un 16/17 et tenté d'en obtenir une soustraction.

    Mais bon, je suis joueur ! Alors j'ai tout d'abord essayé votre code SQL qui me renvoi exactement la même erreur. C'est flatteur me direz-vous, cela me mettrait donc au même niveau qu'un pro ?

    Je vous remercie tout de même pour votre réponse. Néanmoins pendant ce temps, j'ai trouvé la solution à mon problème tout simplement en ajoutant une clause GROUP BY à mon Gloubi-boulga (car oui, ça s'écrit et se dit Gloubi-boulga, votre expression ne signifiant absolument rien.)

    Voici donc le code fonctionnel d'un amateur qui ne connaît pas le SQL (je ne fais que reprendre vos dires, que je trouve encore une fois déplacés pour quelqu'un se disant professionnel qui me juge sans me connaître ni moi ni mon parcours) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Vehicule.immat, vsk2017.[date], vsk2017.km
    FROM Vehicule INNER JOIN Vehicule_suivi_km AS vsk2017 ON Vehicule.immat=vsk2017.immat
    WHERE (((vsk2017.[date])=(SELECT Max([date]) FROM Vehicule_suivi_km WHERE (Vehicule_suivi_km.[date]<#01/01/18# And Vehicule_suivi_km.immat=vsk2017.immat))))
    GROUP BY Vehicule.immat, vsk2017.[date], vsk2017.km
    ORDER BY Vehicule.immat;
    Je ne l'ai cependant pas notifié auparavant car je ne comprenais pas pourquoi SQL Server me renvoyait cette erreur alors qu'avec la clause GROUP BY cela fonctionnait. J'attendais donc d'en apprendre un peu plus de quelqu'un de plus expérimenté que moi sur ce forum qui serait à même de partager cordialement son savoir, d'où ma déception. J'espère cependant ne pas vous avoir braqué avec ma réponse et que, si vous connaissez la réponse, nous pourrions repartir sur de bonnes bases pour la suite de notre discussion.

    PS : Le charabia SQL que j'ai posté est auto-généré par Access. Je l'ai spécifié au début de mon message :
    Nous avons une application Front-end sous Access 2003 utilisant des tables liées d'un SQL Server 2008 R2.
    j'utilise Access en front-end et donc comme outil de querying. Mais ne vous en faite pas, j'ai également essayé votre code sous SMSS :

    Nom : error_smss.png
Affichages : 7911
Taille : 29,1 Ko

    Très cordialement.

  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
    21 768
    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 : 21 768
    Points : 52 571
    Points
    52 571
    Billets dans le blog
    5
    Par défaut
    Vous ne respectez pas la charte de postage. Il est donc difficile de vous aider.

    la prochaine fois respectez là !

    https://www.developpez.net/forums/d9...vement-poster/

    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 du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2015
    Messages : 80
    Points : 45
    Points
    45
    Par défaut
    J'ai respecté la quasi totalité de la charte que vous m'avez fourni. Si il n'y a que ça je peux vous fournir des scripts de créations pour les tables.
    Quant à vous n'oubliez pas qu'il existe une clause de politesse dans la charte d'utilisation du forum.

    Cordialement.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    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 : 21 768
    Points : 52 571
    Points
    52 571
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par maximeozenne Voir le message
    J'ai respecté la quasi totalité de la charte que vous m'avez fourni. Si il n'y a que ça je peux vous fournir des scripts de créations pour les tables.
    C'est justement ce qui manque ainsi qu'un jeu d'essais !

    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/ * * * * *

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Concernant l'erreur que vous obtenez, elle provient probablement de la façon dont Access réécrit la requête. Vous pouvez eventuellement mettre une trace coté SQL Server pour voir la requête générée par Access.

    Concernant votre besoin, dans la mesure où on peut penser que les kilomètres parcourus sont croissants, alors on peut plus simplement écrire :

    (code pour SQL Server, pas testé, et a adapter pour access)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT 
    	   Vehicule.immat
        ,   MAX(VSK.km) - MAX(CASE WHEN YEAR(VSK.[date]) < 2017 THEN km ELSE 0 END) AS km
    FROM Vehicule AS V
    INNER JOIN Vehicule_suivi_km AS VSK
        ON V.immat=VSK.immat    
    WHERE VSK.[date] < '20180101'
    GROUP BY V.immat

Discussions similaires

  1. L'identifieur en plusieurs partie ne peut etre lié
    Par UnlimitedEden dans le forum Développement
    Réponses: 4
    Dernier message: 24/11/2017, 13h43
  2. [MySQL] Plusieurs messages d'erreur en local sous wamp peut être mauvaise configuration
    Par nO_life dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 19/02/2009, 22h20
  3. Réponses: 1
    Dernier message: 24/10/2007, 08h24
  4. Réponses: 2
    Dernier message: 10/03/2004, 18h52
  5. question (peut-être idiote) sur les vues
    Par LadyArwen dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 26/03/2003, 10h35

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