sql >> Database teknologi >  >> RDS >> Sqlserver

Den flerdelte identifikator kunne ikke bindes

Du blander implicitte joinforbindelser med eksplicitte joinforbindelser. Det er tilladt, men du skal være opmærksom på, hvordan du gør det korrekt.

Sagen er, eksplicitte joinforbindelser (dem, der er implementeret ved hjælp af JOIN nøgleord) har forrang frem for implicitte ('komma'et joins, hvor join-betingelsen er angivet i WHERE klausul).

Her er en oversigt over din forespørgsel:

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

Du forventer sandsynligvis, at den opfører sig sådan her:

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

det vil sige kombinationen af ​​tabeller a og b er forbundet med tabellen dkcd . Faktisk er det, der sker,

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

det vil sige, som du måske allerede har forstået, dkcd er sat sammen specifikt mod b og kun b , så kombineres resultatet af joinforbindelsen med a og filtreret yderligere med WHERE klausul. I dette tilfælde enhver henvisning til a i ON klausulen er ugyldig, a er ukendt på det tidspunkt. Det er derfor, du får fejlmeddelelsen.

Hvis jeg var dig, ville jeg nok prøve at omskrive denne forespørgsel, og en mulig løsning kunne være:

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

Her er tabellerne a og b føjes først, derefter føjes resultatet til dkcd . Grundlæggende er dette den samme forespørgsel som din, kun ved at bruge en anden syntaks for en af ​​joinforbindelserne, hvilket gør en stor forskel:referencen a.maxa i dkcd 's deltagelsesbetingelse er nu absolut gyldig.

Som @Aaron Bertrand korrekt har bemærket, bør du sandsynligvis kvalificere dig til maxa med et specifikt alias, sandsynligvis a , i ORDER BY klausul.



  1. Forbedring af MySQL-ydeevne med avancerede InnoDB-indstillinger

  2. Sådan rettes typiske WordPress-fejl

  3. Sådan indsætter du data i SQL Server

  4. Udforskning af Postgres-datoformater og deres forskellige funktioner