2009-03-14 60 views
6

Tôi đang cố gắng thực hiện điều này trong cơ sở dữ liệu SQL Server CE, nhưng công cụ cơ sở dữ liệu giữ lỗi báo cáo.Truy vấn phụ trong SQL Server Compact Edition

SELECT C.guid, C.name, C.updated, 
     C.hddsize, C.hddavailable, C.hddfree, 
     C.ramsize, C.profiles, C.cpu, 
     (SELECT COUNT(D.id) AS numprogs 
      FROM ComputerData AS D 
      WHERE D.computer_id = C.id) AS numprograms 
FROM Computers AS C; 

Tôi đã nói với SQL Server CE hỗ trợ truy vấn phụ. Có điều gì tôi đang làm sai?

+0

lỗi là gì? –

+0

Xin chào, Xin lỗi, nó đã được sửa. Cảm ơn tất cả, Azuka – Zahymaka

Trả lời

5

Trải nghiệm duy nhất của tôi trong truy vấn là với MySQL, nhưng hy vọng nó cũng tương tự như vậy.

Truy vấn của bạn trông lạ đối với tôi vì truy vấn con của bạn nằm trong mệnh đề SELECT. Tôi chưa bao giờ thấy điều đó trước đây ... nhưng dường như nó được hỗ trợ trong MySQL. Thông thường, truy vấn con đến sau một FROM hoặc LEFT JOIN hoặc JOIN.

dụ của bạn là đủ đơn giản mà bạn có thể thực hiện nó với một LEFT JOIN:

SELECT C.guid, ..., COUNT(distinct D.id) as numprogs 
FROM Computers AS C 
LEFT JOIN ComputerData as D ON D.computer_id = C.id 

Trong trường hợp này, LEFT JOIN là đúng loại tham gia để sử dụng vì ngay cả khi không có hồ sơ phù hợp trong Bảng D cho một bản ghi C cụ thể, tập kết quả của bạn sẽ vẫn chứa bản ghi C và các số đó sẽ là 0, như bạn mong đợi.

Nếu bạn thực sự muốn sử dụng một subquery, hãy thử này:

SELECT C.guid, ..., S.numprogs 
FROM Computers AS C 
LEFT JOIN 
(SELECT computer_id, COUNT(*) as numprogs 
FROM ComputerData GROUP BY computer_id) AS S 
ON C.id=S.computer_id 

Tôi đề nghị đơn giản hóa truy vấn của bạn để làm cho nó được truy vấn đơn giản nhất có thể mà nên làm việc, nhưng không hoạt động. Sau đó cho chúng tôi biết thông báo lỗi cụ thể mà công cụ cơ sở dữ liệu của bạn đang trả về.

Chỉnh sửa: Tôi đã nới lỏng trong MySQL chapter about subqueries và có vẻ như bạn nên thử xóa mệnh đề "như numprograms" sau truy vấn con của bạn ... có thể bạn không nhận được bất kỳ lựa chọn nào về việc đặt tên cột xuất phát từ truy vấn phụ sau khi bạn đã tạo truy vấn phụ.

+1

Cảm ơn người đàn ông. Truy vấn đầu tiên không hoạt động, nhưng truy vấn thứ hai đã làm - hoàn hảo. Nó trả về NULL cho các trường hợp mà số đếm là 0, nhưng dựa trên dữ liệu tôi biết tôi sẽ nhận được, tôi là về 99,99% chắc chắn sẽ không bao giờ có được một số 0. Cảm ơn bạn lần nữa, Azuka – Zahymaka

+0

Thật tuyệt khi biết rằng nó hoạt động! Nếu bạn muốn chắc chắn 100% rằng giá trị không phải là null, bạn có thể thay thế S.numprogs bằng "IF (S.numprogs IS NULL, 0, S.numprogs)", hoặc sử dụng ký pháp viết tắt là "IFNULL (S) .numprogs, 0) " –

23

Giới hạn trong SQL CE là nó không hỗ trợ các truy vấn phụ trả về giá trị vô hướng. Các truy vấn phụ trả về một tập hợp được phân tích cú pháp tốt.

Truy vấn phụ trong kết hợp trong câu trả lời của Grayson trả về một tập hợp, vì vậy nó sẽ hoạt động. Đôi khi truy vấn phụ vô hướng không thể tránh được trong điều kiện kết nối. Bằng cách sử dụng 'IN' thay vì '=', trình phân tích cú pháp có thể bị lừa.

Xem câu trả lời của tôi cho this question.

+0

Tốt, giải pháp này đã hiệu quả với tôi! –

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