237 votes

L'identifiant en plusieurs parties n'a pas pu être lié

J'ai vu des erreurs similaires sur SO, mais je ne trouve pas de solution à mon problème. J'ai une requête SQL comme :

SELECT DISTINCT
        a.maxa ,
        b.mahuyen ,
        a.tenxa ,
        b.tenhuyen ,
        ISNULL(dkcd.tong, 0) AS tongdkcd
FROM    phuongxa a ,
        quanhuyen b
        LEFT OUTER JOIN ( SELECT    maxa ,
                                    COUNT(*) AS tong
                          FROM      khaosat
                          WHERE     CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
                                                              AND
                                                              'Sep 5 2011'
                          GROUP BY  maxa
                        ) AS dkcd ON dkcd.maxa = a.maxa
WHERE   a.maxa <> '99'
        AND LEFT(a.maxa, 2) = b.mahuyen
ORDER BY maxa;

Lorsque j'exécute cette requête, le résultat de l'erreur est : L'identifiant en plusieurs parties "a.maxa" n'a pas pu être lié. Pourquoi ?
P/s : si je divise la requête en 2 requêtes individuelles, cela fonctionne bien.

SELECT DISTINCT
        a.maxa ,
        b.mahuyen ,
        a.tenxa ,
        b.tenhuyen
FROM    phuongxa a ,
        quanhuyen b
WHERE   a.maxa <> '99'
        AND LEFT(a.maxa, 2) = b.mahuyen
ORDER BY maxa;

y

SELECT  maxa ,
        COUNT(*) AS tong
FROM    khaosat
WHERE   CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
                                        AND     'Sep 5 2011'
GROUP BY maxa;

0 votes

Est-ce que le phuongxa le tableau comprend une colonne maxa ?

1 votes

Que se passe-t-il si vous ajoutez le groupe par maxa, tong -- juste après le 5 septembre 2011.

0 votes

Oui, c'est le cas. Si je divise la requête en deux sous-requêtes, elle fonctionne bien.

1voto

SVaidya Points 100
SELECT DISTINCT
        phuongxa.maxa ,
        quanhuyen.mahuyen ,
        phuongxa.tenxa ,
        quanhuyen.tenhuyen ,
        ISNULL(dkcd.tong, 0) AS tongdkcd
FROM    phuongxa ,
        quanhuyen
        LEFT OUTER JOIN ( SELECT    khaosat.maxa ,
                                    COUNT(*) AS tong
                          FROM      khaosat
                          WHERE     CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
                                                              AND
                                                              'Sep 5 2011'
                          GROUP BY  khaosat.maxa
                        ) AS dkcd ON dkcd.maxa = maxa
WHERE   phuongxa.maxa <> '99'
        AND LEFT(phuongxa.maxa, 2) = quanhuyen.mahuyen
ORDER BY maxa;

1voto

Zolfaghari Points 41

Mon erreur était d'utiliser un champ qui n'existait pas dans la table.

table1.field1 => is not exist

table2.field1 => est correct

Corrigez le nom de votre table.

mon erreur s'est produite à cause de l'utilisation de WITH

WITH RCTE AS (
   SELECT...
)
SELECT RCTE.Name, ...
FROM 
  RCTE INNER JOIN Customer
  ON RCTE.CustomerID = Customer.ID 

lorsqu'il est utilisé dans une jointure avec d'autres tables ...

1voto

JedatKinports Points 2155

Avez-vous oublié de joindre certaines tables ? Si ce n'est pas le cas, vous devez probablement utiliser des alias.

1voto

Tore Aurstad Points 857

Je me débattais aussi avec cette erreur et j'ai fini par adopter la même stratégie que la réponse. J'inclus ma réponse juste pour confirmer que cette stratégie devrait fonctionner.

Voici un exemple où je fais d'abord une jointure interne entre deux tables dont je sais qu'elles contiennent des données, puis deux jointures externes gauches sur des tables qui pourraient avoir des lignes correspondantes qui peuvent être vides. Vous mélangez les jointures internes et externes pour obtenir des résultats avec des données entre les tables au lieu d'utiliser la syntaxe par défaut de séparation par virgule entre les tables et de manquer des lignes dans votre jointure souhaitée.

use somedatabase
go 

select o.operationid, o.operatingdate, p.pasid, p.name as patientname, o.operationalunitid, f.name as operasjonsprogram,  o.theaterid as stueid, t.name as stuenavn, o.status as operasjonsstatus from operation o 
inner join patient p on o.operationid = p.operationid 
left outer join freshorganizationalunit f on f.freshorganizationalunitid = o.operationalunitid
left outer join theater t on t.theaterid = o.theaterid
where (p.Name like '%Male[0-9]%' or p.Name like '%KFemale [0-9]%')

Premièrement : Faites les jointures internes entre les tables dont vous pensez qu'elles correspondent aux données. Deuxième partie : Continuez avec les jointures externes pour essayer de récupérer les données dans les autres tables, mais cela ne filtrera pas votre ensemble de résultats si la table à laquelle vous vous joignez n'a pas de données correspondantes ou ne correspond pas à la condition que vous avez définie dans le prédicat / la condition on.

1voto

Andrew Points 6859

Cette erreur peut également être causée par l'absence d'une virgule. , entre les noms de colonnes dans l'instruction SELECT.

eg :

SELECT MyCol1, MyCol2 MyCol3 FROM SomeTable;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X