Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Không thể liên kết số nhận dạng nhiều phần

Bạn đang trộn các phép nối ngầm với các phép nối rõ ràng. Điều đó được cho phép, nhưng bạn cần biết cách thực hiện điều đó đúng cách.

Vấn đề là, các phép nối rõ ràng (các phép nối được triển khai bằng cách sử dụng JOIN từ khóa) được ưu tiên hơn những từ khóa ngầm định (kết hợp 'dấu phẩy', trong đó điều kiện kết hợp được chỉ định trong WHERE mệnh đề).

Đây là phác thảo về truy vấn của bạn:

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

Bạn có thể đang mong đợi nó hoạt động như thế này:

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

nghĩa là, sự kết hợp của các bảng ab được kết hợp với bảng dkcd . Trên thực tế, những gì đang xảy ra là

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

nghĩa là, như bạn có thể đã hiểu, dkcd được kết hợp cụ thể với b và chỉ b , sau đó kết quả của phép nối được kết hợp với a và được lọc thêm bằng WHERE mệnh đề. Trong trường hợp này, mọi tham chiếu đến a trong ON mệnh đề không hợp lệ, a không rõ tại thời điểm đó. Đó là lý do tại sao bạn nhận được thông báo lỗi.

Nếu tôi là bạn, tôi có thể sẽ cố gắng viết lại truy vấn này và một giải pháp khả thi có thể là:

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

Đây là các bảng ab được nối đầu tiên, sau đó kết quả được nối với dkcd . Về cơ bản, đây là truy vấn giống với truy vấn của bạn, chỉ sử dụng cú pháp khác cho một trong các phép nối, điều này tạo ra sự khác biệt lớn:tham chiếu a.maxa trong dkcd Điều kiện tham gia của bây giờ hoàn toàn hợp lệ.

Như @Aaron Bertrand đã lưu ý chính xác, bạn có thể đủ điều kiện maxa với một bí danh cụ thể, có thể là a , trong ORDER BY mệnh đề.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tạo cơ sở dữ liệu máy chủ SQL với Azure Data Studio

  2. SQL Server UNION - ORDER BY Behavior mặc định là gì

  3. Thêm tài khoản thư cơ sở dữ liệu vào cấu hình (T-SQL)

  4. Sự khác biệt giữa sys.sql_modules, sys.system_sql_modules và sys.all_sql_modules trong SQL Server

  5. Những sai lầm phổ biến của DBA trong MS SQL Server