sql >> Databasteknik >  >> RDS >> Sqlserver

Den flerdelade identifieraren kunde inte bindas

Du blandar implicita kopplingar med explicita kopplingar. Det är tillåtet, men du måste vara medveten om hur du gör det på rätt sätt.

Saken är, explicita kopplingar (de som är implementerade med JOIN nyckelord) har företräde framför implicita ('komma' ansluter, där kopplingsvillkoret anges i WHERE klausul).

Här är en sammanfattning av din fråga:

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

Du förväntar dig förmodligen att det ska bete sig så här:

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

det vill säga kombinationen av tabeller a och b är sammanfogad med tabellen dkcd . Faktum är att det som händer är

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

det vill säga, som du kanske redan har förstått, dkcd är förenad specifikt mot b och endast b , sedan kombineras resultatet av kopplingen med a och filtrerade vidare med WHERE klausul. I det här fallet, alla hänvisningar till a i ON satsen är ogiltig, a är okänd vid den tidpunkten. Det är därför du får felmeddelandet.

Om jag var du skulle jag förmodligen försöka skriva om den här frågan, och en möjlig lösning kan vara:

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

Här är tabellerna a och b sammanfogas först, sedan sammanfogas resultatet till dkcd . I grund och botten är detta samma fråga som din, endast med en annan syntax för en av joinningarna, vilket gör stor skillnad:referensen a.maxa i dkcd s anslutningsvillkor är nu absolut giltigt.

Som @Aaron Bertrand korrekt har noterat bör du förmodligen kvalificera dig för maxa med ett specifikt alias, förmodligen a , i ORDER BY klausul.



  1. Hämta föregående och nästa rad från rader valda med (WHERE) villkor

  2. Lägg till en länkad serverinloggning i SQL Server (T-SQL-exempel)

  3. Postgres heltalsmatriser som parametrar?

  4. En bugg för uppskattning av kardinalitet i underfrågan