Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Идентификаторът от няколко части не можа да бъде обвързан

Смесвате неявни съединения с явни съединения. Това е позволено, но трябва да сте наясно как да го направите правилно.

Работата е в изричните присъединявания (тези, които се реализират с помощта на JOIN ключова дума) имат предимство пред имплицитните (съединява се „запетая“, където условието за присъединяване е посочено в WHERE клауза).

Ето схема на вашата заявка:

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

Вероятно очаквате да се държи по следния начин:

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

тоест комбинацията от таблици a и b се присъединява към таблицата dkcd . Всъщност това, което се случва е

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

тоест, както може би вече сте разбрали, dkcd се съединява специално срещу b и само b , след което резултатът от присъединяването се комбинира с a и се филтрира допълнително с WHERE клауза. В този случай всяка препратка към a в ON клаузата е невалидна, a е неизвестен към този момент. Ето защо получавате съобщението за грешка.

Ако бях на твое място, вероятно щях да се опитам да пренапиша тази заявка и едно възможно решение може да бъде:

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

Ето таблиците a и b се присъединяват първо, след това резултатът се присъединява към dkcd . По принцип това е същата заявка като вашата, само използвайки различен синтаксис за едно от присъединяванията, което прави голяма разлика:препратката a.maxa в dkcd Условието за присъединяване на 's вече е абсолютно валидно.

Както правилно отбеляза @Aaron Bertrand, вероятно трябва да квалифицирате maxa със специфичен псевдоним, вероятно a , в ORDER BY клауза.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какво представлява SQL Server Management Studio (SSMS)?

  2. Използване на DMV (изглед за динамично управление) и DMF (функция за динамично управление) | Отстраняване на проблеми с производителността на SQL Server -4

  3. Премахване на акаунт в база данни за поща от профил (SSMS)

  4. Производителност на SQL брой(*).

  5. Поправете съобщение 8116 „Дата на типа данни на аргумента е невалидна за аргумент 1 на функцията под низ“ в SQL Server