2009-08-11 26 views
6

Khi LEFT JOINing bảng trong truy vấn SQL, đôi khi tôi cần tham chiếu nhiều bảng trong mệnh đề ON. Ví dụ:Lỗi SQL: Mã định danh nhiều phần "tableName.ColumnName" không thể bị ràng buộc

SELECT p.Name, j.Job, s.Salary 
FROM PeopleTable p, JobTable j 
LEFT JOIN SalaryTable s ON s.PeopleID=p.PeopleID AND s.JobID=j.JobID 

Tuy nhiên, ở trên sẽ cung cấp cho lỗi này:

SQL Error: The multi-part identifier "p.PeopleID" could not be bound.

Dường như ON khoản trong một tuyên bố LEFT JOIN chỉ có thể "nhìn thấy" bảng cuối cùng được liệt kê trong FROM danh sách. Điều này có đúng không? Bất kỳ cách giải quyết nào?

+0

Xem: http://stackoverflow.com/questions/1080097/the-multi-part-identifier-could-not-be-bound-on- sql-server-2005-8/1080407 # 1080407 –

Trả lời

7

Bạn có thể không trộn SQL-89 Tham số cú pháp "bảng, bảng" với cú pháp tham gia SQL-92 "bảng LEFT JOIN bảng ON điều kiện"

+1

có vẻ như bạn có thể trộn chúng, nhưng thứ tự quan trọng là thử: chọn * từ \t msdb..sysjobsteps s, msdb..sysjobs j tham gia msdb..syscategories c trên j.category_id = c.category_id trong đó j. job_id = s.job_id –

+1

nhưng trộn chúng theo cách mà JerSchneid muốn rõ ràng là khác nhau! –

+0

Tôi đoán rằng bên ngoài tham gia hiện tại vấn đề irresolvable để trình biên dịch khi cố gắng giải quyết logic. (tính đặc hiệu của các điều kiện kết nối bên ngoài là một trong những điều khác biệt đáng kể giữa hai điều này). – RBarryYoung

0

Hãy thử

SELECT p.Name, j.Job, s.Salary 
FROM SalaryTable s 
LEFT JOIN PeopleTable p on s.PeopleID = p.PeopleID 
LEFT JOIN JobTable j ON s.JobID = j.JobID 
0

tôi không shure tại sao si đó nhưng TỪ PeopleTable p, JobTable j có thể được thay thế bằng CROSS JOIN

SELECT p.Name, j.Job, s.Salary 
FROM PeopleTable p 
    CROSS JOIN JobTable j 
    LEFT JOIN SalaryTable s ON s.PeopleID=p.PeopleID AND s.JobID=j.JobID 

Regrads nhất, Iordan

+0

đó sẽ là do anh ta đã viết nó như là một tham gia chéo đã inthe cũ lỗi thời cú pháp. Tôi không thuyết phục những gì anh ấy viết là những gì anh ấy thực sự cần. – HLGEM

3

Trong khi cú pháp nối chéo là bản dịch trực tiếp của những gì bạn cung cấp, nó có thể không phù hợp với hoàn cảnh của bạn. Nó sẽ liên kết tất cả mọi người với tất cả các công việc trước khi rời tham gia bảng lương. Điều này dường như không có khả năng là đây là những gì bạn muốn.

Bạn có thực sự có bất kỳ người nào không được liên kết với mức lương không? Đối với vấn đề đó bạn có muốn thấy bất kỳ công việc nào không liên quan đến lương hay người không? Dữ liệu mẫu và tập hợp kết quả sẽ giúp chúng tôi cung cấp cho bạn truy vấn thực hiện những gì bạn thực sự cần. Tôi nghi ngờ một trong những điều sau đây có thể cung cấp cho bạn kết quả tốt hơn:

SELECT p.Name, j.Job, s.Salary 
FROM PeopleTable p 
JOIN SalaryTable s ON s.PeopleID=p.PeopleID 
RIGHT JOIN JobTable j ON s.JobID=j.JobID 

SELECT p.Name, j.Job, s.Salary 
FROM PeopleTable p 
JOIN SalaryTable s ON s.PeopleID=p.PeopleID 
JOIN JobTable j ON s.JobID=j.JobID 

SELECT p.Name, j.Job, s.Salary 
FROM SalaryTable s 
RIGHT JOIN PeopleTable p ON s.PeopleID=p.PeopleID 
RIGHT JOIN JobTable j ON s.JobID=j.JobID 
+0

Tôi thực sự chỉ làm những bảng đó như một ví dụ. Tôi chạy vào loại bảng, bảng, trái tham gia vấn đề này một lần trong một thời gian và tôi đã chỉ tự hỏi nếu có bất kỳ thủ đoạn ra khỏi đó mà tôi không biết, khác hơn là sắp xếp lại truy vấn của tôi. – JerSchneid

Các vấn đề liên quan