2009-06-29 31 views
23

Tôi nhận được lỗi sau khi cố gắng chạy truy vấn này trong sql 2005:sql 2005 - Cột đã được chỉ định nhiều lần

SELECT tb.* 
    FROM (
     SELECT * 
     FROM vCodesWithPEs INNER JOIN vDeriveAvailabilityFromPE 
     ON vCodesWithPEs.PROD_PERM = vDeriveAvailabilityFromPE.PEID 
     INNER JOIN PE_PDP ON vCodesWithPEs.PROD_PERM = PE_PDP.PEID 
    ) AS tb; 

Error: The column 'PEID' was specified multiple times for 'tb'. 

Tôi mới vào sql. Cảm ơn bạn trước cho lời khuyên của bạn.

Eneo.

+2

Chỉ vì tò mò, tại sao bạn có "chọn tb. *" Bên ngoài? – NotMe

Trả lời

33

Vấn đề, như đã nói, là bạn đang chọn PEID từ hai bảng, giải pháp là để xác định các PEID nào bạn muốn, ví dụ

SELECT tb.* 
    FROM (
     SELECT tb1.PEID,tb2.col1,tb2.col2,tb3.col3 --, and so on 
     FROM vCodesWithPEs as tb1 INNER JOIN vDeriveAvailabilityFromPE as tb2 
     ON tb1.PROD_PERM = tb2.PEID 
     INNER JOIN PE_PDP tb3 ON tb1.PROD_PERM = tb3.PEID 
    ) AS tb; 

đó sang một bên, như Chris Lively khéo léo chỉ ra trong một nhận xét SELECT bên ngoài là hoàn toàn thừa. Sau đây là hoàn toàn tương đương với đầu tiên.

 SELECT tb1.PEID,tb2.col1,tb2.col2,tb3.col3 --, and so on 
     FROM vCodesWithPEs as tb1 INNER JOIN vDeriveAvailabilityFromPE as tb2 
     ON tb1.PROD_PERM = tb2.PEID 
     INNER JOIN PE_PDP tb3 ON tb1.PROD_PERM = tb3.PEID 

hoặc thậm chí

 SELECT * 
     FROM vCodesWithPEs as tb1 INNER JOIN vDeriveAvailabilityFromPE as tb2 
     ON tb1.PROD_PERM = tb2.PEID 
     INNER JOIN PE_PDP tb3 ON tb1.PROD_PERM = tb3.PEID 

nhưng xin tránh sử dụng SELECT * bất cứ khi nào có thể. Nó có thể làm việc trong khi bạn đang làm các truy vấn tương tác để lưu gõ, nhưng trong mã sản xuất không bao giờ sử dụng nó.

4

Hình như bạn có cột PEID trong cả hai bảng: vDeriveAvailabilityFromPEPE_PDP. Tuyên bố SELECT cố gắng chọn cả hai và đưa ra lỗi về tên cột trùng lặp.

+0

Anh ấy có nó trong cả hai bảng, không chỉ trông giống như :) –

+0

Bạn nói đúng, Vinko. :-) Trên một sidenote: Tại sao tên bảng thứ hai của tôi không được hiển thị bằng chữ in nghiêng? (đặt nó trong * *, nhưng hiển thị dưới dạng * PE_PDP *) Xem trước là chính xác. – MicSim

+0

Tôi không biết, vấn đề cho việc sử dụng dịch vụ mà tôi nghĩ. Tôi đã thử một số thủ thuật thông thường (thêm khoảng trống hoặc định dạng lại) nhưng nó không hoạt động –

1

Bạn đang tham gia ba bảng và xem tất cả các cột ở đầu ra (*).

Dường như các bảng có tên cột chung là PEID, mà bạn sẽ phải đặt tên là một cái gì đó khác.

Giải pháp: không sử dụng * trong truy vấn con, nhưng chọn rõ từng cột bạn muốn xem, đặt bí danh bất kỳ tên cột nào xuất hiện nhiều lần.

0

Thay vì sử dụng * để xác định việc thu thập tất cả các trường, hãy viết lại truy vấn của bạn để đặt tên rõ ràng các cột bạn muốn. Bằng cách đó sẽ không có sự nhầm lẫn.

0

chỉ cần cung cấp tên bí danh mới cho cột lặp lại, nó làm việc cho tôi .....

+2

Vui lòng xem xét chỉnh sửa câu trả lời của bạn để cung cấp thêm chi tiết về lý do giải pháp của bạn công trinh. Điều này sẽ giúp OP và bất kỳ ai có cùng vấn đề trong tương lai – CallumDA

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