L’identificatore a più parti non può essere associato

Ho visto errori simili su SO, ma non trovo una soluzione per il mio problema. Ho una query SQL come:

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; 

Quando eseguo questa query, il risultato dell’errore è: Non è stato ansible associare l’identificatore a più parti “a.maxa”. Perché?
P / s: se divido la query in 2 singole query, funziona ok.

 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; 

e

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

Stai mescolando join impliciti con join espliciti. Questo è permesso, ma è necessario essere consapevoli di come farlo correttamente.

Il fatto è che i join espliciti (quelli implementati usando la parola chiave JOIN ) hanno la precedenza su quelli impliciti (i join “virgola”, dove la condizione di join è specificata nella clausola WHERE ).

Ecco uno schema della tua query:

 SELECT … FROM a, b LEFT JOIN dkcd ON … WHERE … 

Probabilmente ti aspetti che si comporti in questo modo:

 SELECT … FROM (a, b) LEFT JOIN dkcd ON … WHERE … 

cioè, la combinazione delle tabelle b è unita alla tabella dkcd . In realtà, quello che sta succedendo è

 SELECT … FROM a, (b LEFT JOIN dkcd ON …) WHERE … 

cioè, come forse già avete capito, dkcd è unito specificatamente contro b e solo b , quindi il risultato del join è combinato con a e ulteriormente filtrato con la clausola WHERE . In questo caso, qualsiasi riferimento ad a nella clausola ON non è valido, a è sconosciuto a quel punto. Questo è il motivo per cui ricevi il messaggio di errore.

Se fossi in te, probabilmente proverei a riscrivere questa query e una ansible soluzione potrebbe essere:

 SELECT DISTINCT a.maxa, b.mahuyen, a.tenxa, b.tenhuyen, ISNULL(dkcd.tong, 0) AS tongdkcd FROM phuongxa a INNER JOIN quanhuyen b ON LEFT(a.maxa, 2) = b.mahuyen 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' ORDER BY a.maxa 

Qui le tabelle b vengono prima aggiunte, quindi il risultato è unito a dkcd . Fondamentalmente, questa è la stessa query della tua, usando solo una syntax diversa per uno dei join, il che fa una grande differenza: il riferimento a.maxa nella condizione join di dkcd è ora assolutamente valido.

Come ha giustamente osservato @Aaron Bertrand, probabilmente dovresti qualificare maxa con uno specifico alias, probabilmente a , nella clausola ORDER BY .

A volte questo errore si verifica quando si utilizza lo schema (dbo) nella query in modo errato.

per esempio se scrivi:

 select dbo.prd.name from dbo.product prd 

otterrai l’errore

In questa situazione, cambialo in:

 select prd.name from dbo.product prd 

se hai dato il nome, cambia il nome al vero nome

per esempio

 SELECT A.name,A.date FROM [LoginInfo].[dbo].[TableA] as A join [LoginInfo].[dbo].[TableA] as B on [LoginInfo].[dbo].[TableA].name=[LoginInfo].[dbo].[TableB].name; 

cambiarlo

 SELECT A.name,A.date FROM [LoginInfo].[dbo].[TableA] as A join [LoginInfo].[dbo].[TableA] as B on A.name=B.name; 

Stavo lottando con lo stesso messaggio di errore in SQL SERVER, dal momento che ho avuto più join, cambiando l’ ordine dei join risolto per me.

Sono nuovo di SQL, ma ho trovato questo problema in un corso che stavo prendendo e ho scoperto che l’assegnazione della query al progetto ha contribuito in particolare a eliminare l’errore a più parti. Ad esempio, il progetto che ho creato era CTU SQL Project, quindi mi sono assicurato di iniziare il mio script con USE [CTU SQL Project] come prima riga come di seguito.

 USE [CTU SQL Project] SELECT Advisors.First_Name, Advisors.Last_Name...and so on. 

Se questo errore si verifica in un UPDATE , ricontrolla il JOIN sulla tabella con la colonna / campo che causa l’errore.

Nel mio caso ciò era dovuto alla mancanza dello stesso JOIN , che generava lo stesso errore a causa di un campo sconosciuto (come sottolineato da Andriy ).

Invece puoi provare ad unire tabelle come,

 select .... from dkcd right join a , b 

Questo dovrebbe funzionare

 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; 

Il mio errore era usare un campo che non esisteva nella tabella.

table1.field1 => non esiste

table2.field1 => è corretto

Correggere il nome della tabella.

il mio errore si è verificato a causa dell’utilizzo di WITH

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

quando usato in join con altre tabelle …

Hai dimenticato di unirti ad alcuni tavoli? In caso contrario, probabilmente è necessario utilizzare alcuni alias.

Nel mio caso il problema si è rivelato essere il nome alias che avevo dato al tavolo. “o” sembra non essere accettabile per SQL Server.

Se nessuna di queste funzioni funziona, prova a copiare i risultati noti che soddisfano uno dei criteri di ricerca in una tabella temporanea, quindi esegui il join su quello.

Stavo avendo lo stesso errore da JDBC. Controllato tutto e la mia richiesta andava bene. Venuto fuori, in cui clausola ho un argomento:

 where s.some_column = ? 

E il valore dell’argomento che stavo passando era nullo. Questo dà anche lo stesso errore che è fuorviante perché quando si esegue una ricerca su Internet si finisce che qualcosa non funziona nella struttura della query, ma non è nel mio caso. Pensavo che qualcuno potrebbe affrontare lo stesso problema

Ero anche alle prese con questo errore e ho finito con la stessa strategia della risposta. Sto includendo la mia risposta solo per confermare che questa è una strategia che dovrebbe funzionare.

Ecco un esempio in cui eseguo il primo inner join tra due tabelle che conosco i dati e quindi due outer join a sinistra su tabelle che potrebbero avere righe corrispondenti che possono essere vuote. Mescoli join interni e join esterni per ottenere risultati con i dati sulle tabelle anziché eseguire la syntax predefinita da virgola separata tra le tabelle e saltare le righe nel join desiderato.

 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]%') 

Primo: esegui i join interni tra le tabelle che prevedi di avere corrispondenza dei dati. Seconda parte: continua con join esterni per cercare di recuperare i dati in altre tabelle, ma ciò non filtrerà il set di risultati se la tabella outer join non ha dati corrispondenti o corrisponde alla condizione impostata nel predicato / condizione on.