sql >> Databáze >  >> RDS >> Sqlserver

Vícedílný identifikátor nelze svázat

Mícháte implicitní spojení s explicitními spojeními. To je povoleno, ale musíte si být vědomi toho, jak to udělat správně.

Jde o to, že explicitní spojení (ta, která jsou implementována pomocí JOIN klíčové slovo) mají přednost před implicitními (spojení 'čárkou', kde je podmínka spojení uvedena v WHERE doložka).

Zde je přehled vašeho dotazu:

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

Pravděpodobně očekáváte, že se bude chovat takto:

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

tedy kombinaci tabulek a a b je spojen s tabulkou dkcd . Ve skutečnosti se to, co se děje,

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

to je, jak jste již možná pochopili, dkcd je spojen specificky proti b a pouze b , pak se výsledek spojení zkombinuje s a a dále filtrováno pomocí WHERE doložka. V tomto případě jakýkoli odkaz na a v ON klauzule je neplatná, a je v tu chvíli neznámý. Proto se vám zobrazuje chybová zpráva.

Být vámi, pravděpodobně bych se pokusil tento dotaz přepsat a jedním z možných řešení by mohlo být:

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

Zde jsou tabulky a a b jsou nejprve spojeny, pak je výsledek spojen s dkcd . V zásadě se jedná o stejný dotaz jako váš, pouze s použitím jiné syntaxe pro jedno ze spojení, což je velký rozdíl:odkaz a.maxa v dkcd Podmínka připojení uživatele je nyní absolutně platná.

Jak správně poznamenal @Aaron Bertrand, pravděpodobně byste měli kvalifikovat maxa se specifickým aliasem, pravděpodobně a , v ORDER BY doložka.



  1. Postgresql SQL GROUP BY časový interval s libovolnou přesností (až na milisekundy)

  2. Postgres Copy from Variable with CSV data

  3. Zpráva o databázi Open Source za rok 2019:Nejlepší databáze, veřejný cloud vs. On-Premise, Polyglot Persistence

  4. Jak LENGTH() funguje v MariaDB