2009-07-03 29 views
5

Tôi có 2 bảngTừ định đa phần không thể bị ràng buộc về SQL Server 2008

requests (ID, company_id, amount)

companies (ID, name)

với FK chế (requests.company_id ->companies.id)

requests.company có thể là NULL

Tôi cần nhận tất cả yêu cầu và thay thế company_id bằng công ty thích hợp name hoặc để trống nếu không có công ty nào được chỉ định.

Tôi có câu hỏi tiếp theo:

SELECT R.[ID], C.[name] AS [company], R.[amount], ... 
FROM [requests] AS R, [companies] AS C, ... 
WHERE R.[company_id] = C.[ID] 

và nó làm việc tốt cho đến khi một NULL vào company lĩnh vực.

Tôi cố gắng để làm gì tiếp theo:

SELECT R.[ID], C.[name] AS [company], ... 
FROM [requests] AS R, ... 
LEFT OUTER JOIN [companies] AS C 
ON R.[company_id] = S.ID 

Nhưng có

Các đa phần nhận dạng "R.company_id" không thể bị ràng buộc

Và các lỗi tương tự trên lĩnh vực trong ON thay đổi khoản. Tôi đang làm gì sai?

Trả lời

9

Ví dụ mã bạn đã cho thấy có dấu ba chấm và tôi tin rằng đó là những gì trong hình elip gây ra sự cố.

Bạn có:

SELECT R.[ID], C.[name] AS [company], ... 
FROM [requests] AS R, ... 
LEFT OUTER JOIN [companies] AS C 
ON R.[company_id] = S.ID 

Hãy nói rằng đó là một cái gì đó như:

SELECT R.[ID], C.[name] AS [company], X.Field 
FROM [requests] AS R, [eXample] as X 
LEFT OUTER JOIN [companies] AS C 
ON R.[company_id] = S.ID 
WHERE X.[request_id] = R.ID 

Nói cách khác sự pha trộn của pre-ANSI 92 bên tham gia cú pháp với ANSI 92 bên ngoài tham gia cú pháp. Thử nghiệm trên SQL Server 2005, có vẻ như bí danh R cho các yêu cầu không được nhìn thấy qua dấu phẩy tách R từ ... trong ví dụ của bạn và [eXample] dưới dạng X trong tôi.sau khi làm việc tuy nhiên đã làm:

SELECT R.[ID], C.[name] AS [company], X.Field 
FROM [eXample] as X, [requests] AS R 
-- Requests and companies on the same side of the comma 
LEFT OUTER JOIN [companies] AS C 
ON R.[company_id] = S.ID 
WHERE X.[request_id] = R.ID 

hoặc

SELECT R.[ID], C.[name] AS [company], X.Field 
FROM [requests] AS R LEFT OUTER JOIN [companies] AS C 
    ON R.[company_id] = S.ID, [eXample] as X 
WHERE X.[request_id] = R.ID 
-- Yuck, I would hate to find this. Not at all sure from reading 
-- the code how it would work. 

hoặc yêu thích của tôi, vì tôi thích ANSI 92 tham gia cú pháp:

SELECT R.[ID], C.[name] AS [company], X.Field 
FROM [requests] AS R 
INNER JOIN [eXample] as X ON X.[request_id] = R.ID 
LEFT OUTER JOIN [companies] AS C ON R.[company_id] = S.ID 
+2

Bảng được đặt bí danh là "S" sao cho ràng buộc "= S.ID" hoạt động? –

+1

S.ID là trong OP, có thể là một cái gì đó trong hình elip. ??? Vì nó đã giúp OP, tôi không muốn chỉnh sửa, bởi vì tôi sợ rằng tôi sẽ chỉ giải thích lời giải thích. Thật khó làm việc với mã bị thiếu. –

3

Tôi nghĩ rằng bạn muốn:

SELECT R.[ID], ISNULL(C.[name], '') AS [company] 
FROM [requests] AS R 
    LEFT OUTER JOIN [companies] AS C 
ON R.[company_id] = C.ID 

EDIT: Xem ý kiến, bên trái join là cần thiết ...

Nó cũng xuất hiện với tôi rằng không cần cho trái tham gia, vì vậy bạn có thể viết lại là:

SELECT R.[ID], C.[name] AS [company] 
FROM [requests] AS R 
    JOIN [companies] AS C 
ON R.[company_id] = C.ID 
+0

Anh ấy cần tham gia bên trái. Requests.Company_ID có thể là null. Không có tham gia bên ngoài, các yêu cầu trong đó Company_ID là null sẽ bị loại bỏ khỏi kết quả. –

+0

@ Shannon, bạn nói đúng, tôi đã bỏ lỡ điều này: hoặc để trống nếu không có công ty nào được chỉ định. –

1

Thay đổi thứ tự bảng trong dấu phẩy làm cho nó hoạt động trong máy chủ sql 2005,2008 và 2012

ví dụ:

Hãy nói rằng bạn có một truy vấn như dưới đây mà sẽ thất bại trong sql 2005 trở lên:

SELECT t1.*,t2.*, t3.* 
FROM table1 AS t1, table2 as t2 
LEFT OUTER JOIN table3 AS t3 
ON t1.id = t3.id 
WHERE t1.id = t2.id 

Truy vấn sẽ làm việc trong sql 2005 và ở trên nếu bạn viết lại truy vấn và thay đổi thứ tự của bảng trong dấu phẩy trước khi tham gia. ví dụ:

SELECT t1.*,t2.*, t3.* 
FROM table2 as t2, table1 as t1 
LEFT OUTER JOIN table3 AS t3 
ON t1.id = t3.id 
WHERE t1.id = t2.id 
Các vấn đề liên quan