2012-02-13 42 views
10

Tôi cố gắng để tìm thấy một lỗi trong một câu lệnh SQL khổng lồ (không phải của tôi) - Tôi đã cắt giảm rất nhiều của nó ra để làm cho nó có thể đọc được - thậm chí pared xuống nó vẫn ném lỗiSQL Duplicate tên cột lỗi

SELECT DISTINCT Profiles.ID 
FROM 
    (select * from Profiles RIGHT JOIN FriendList ON (FriendList.Profile = 15237) 
    order by LastLoggedIn DESC) as Profiles 

này trả về một lỗi

tên cột trùng lặp 'ID'

tôi đã thử nghiệm những phần cuối cùng (select * from Profiles ... order by LastLoggedIn DESC) và nó hoạt động tốt bằng cách riêng của mình

Tôi đã cố gắng khắc phục sự cố bằng cách thay đổi tên cột trong phần DISTINCT mà không có bất kỳ sự may mắn nào.

Một giải pháp tôi đọc là xóa DISTINCT, nhưng điều đó không có tác dụng.

Tôi chỉ không thể biết được lỗi của cột trùng lặp có thể đến từ đâu. Nó có thể là một vấn đề toàn vẹn cơ sở dữ liệu?

Bất kỳ giúp nhiều đánh giá cao.

+0

có cột id trong bảng hồ sơ xung đột với cột id của một bảng khác không? Bạn đang chọn tất cả các cột, tôi khuyên bạn nên giảm số lượng cột chọn (thay đổi * thành tên cột) và xem liệu cột đó có khắc phục được sự cố của bạn hay không. – Robert

+0

Có thể là cả bảng 'Profiles' và' FriendList' trong 'SELECT' bên trong của bạn có cột' ID' ?? Vì vậy, về cơ bản bạn sẽ có hai cột, cả hai được gọi là 'ID' - và bạn đang chọn ** mọi thứ ** từ' JOIN' - vì vậy mà 'ID' là bạn đề cập đến khi bạn nói' SELECT DISTINCT Profiles.ID .. ... '?!?!? –

+0

marc_s & Robert - vâng, đó là những gì đang diễn ra. Tôi đoán là nhiều nhưng đây chỉ là ngoài sự hiểu biết SQL của tôi. Vấn đề là câu lệnh SQL là MASSIVE và được xây dựng động.Tôi cắt nó thành xương trần cho câu hỏi này. Tôi sẽ quăng nó trở lại với người như những tác động gõ cửa của việc rối tung với điều này hoặc db quá khủng khiếp để suy ngẫm. – Steve

Trả lời

10

Các bảng ProfileFriendList đều có cột ID. Vì bạn nói select *, bạn sẽ nhận được hai cột có tên là ID trong danh sách con được đặt tên là Profiles và SQL không biết cái nào là Profiles.ID đề cập đến (lưu ý rằng Profiles ở đây đề cập đến bí danh của truy vấn phụ , không phải bảng cùng tên).

Vì bạn chỉ cần cột ID, bạn có thể thay đổi nó như thế này:

SELECT DISTINCT Profiles.ID FROM 
(select Profiles.ID from Profiles RIGHT JOIN FriendList ON (FriendList.Profile = 15237) 
order by LastLoggedIn DESC) as Profiles 
0

bạn có một bảng gọi là Cấu hình và bạn đang "tạo ra" một bảng tạm gọi là Profiles in của bạn Từ, đó sẽ là tôi đoán như những gì đang gây ra vấn đề. gọi chuối tạm thời của bạn và thử SELECT DISTINCT bananas.ID FROM và xem điều đó có hoạt động hay không

0

Khi lỗi nói, mỗi bảng bạn đang kết hợp với nhau có cột có tên là ID. Bạn sẽ phải chỉ định cột ID nào bạn muốn (Profiles.ID hoặc FriendList.ID) hoặc bao gồm ID trong điều kiện kết hợp.

0

Tiểu sử và Danh sách bạn bè đều có cột ID. Bạn đang yêu cầu gọi toàn bộ tham gia "Hồ sơ", và sau đó sử dụng Profiles.ID, nhưng SQL không biết bạn có nghĩa là ID nào.

1

Thay thế "select *" bằng "select col1, col2 ..." và lỗi sẽ trở nên rõ ràng (nghĩa là nhiều cột có tên "ID"). Không có gì để làm với tính toàn vẹn riêng biệt hoặc cơ sở dữ liệu.

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