2013-06-28 30 views
5

Tôi có truy vấn này:Bắt lỗi khi sử dụng tham gia vào truy vấn

SELECT * FROM `employee_activities` a 
LEFT JOIN `activity` b ON a.activity_code = b.code 
LEFT JOIN `employees` c ON a.employee_code = c.code 
WHERE b.type = "Design" 
AND c.code NOT IN(
    SELECT * FROM `employee_activities` a 
     LEFT JOIN `activity` b ON a.activity_code = b.code 
     LEFT JOIN `employees` c ON a.employee_code = c.code 
     WHERE b.type = "Testing" 
) 
GROUP BY c.code 

tôi nhận được lỗi này:

#1241 - Operand should contain 1 column(s) 

Tôi buộc để có được tất cả các nhân viên rằng có ít nhất một hoạt động của nhập "Thiết kế" và Không có hoạt động nào thuộc loại "Thử nghiệm".

Tôi có truy vấn hoạt động nhưng tôi muốn nó hoạt động với các kết nối.

này hoạt động:

SELECT c.name FROM `employee_activities` a, `activity` b, `employees` c 
WHERE a.activity_code = b.code 
AND a.employee_code = c.code 
AND b.type = "Design" 

AND c.code NOT IN(
    SELECT c.code FROM `employee_activities` a, `activity` b, `employees` c 
     WHERE a.activity_code = b.code 
     AND a.employee_code = c.code 
     AND b.type = "Testing" 
) 
GROUP BY c.code 

Tôi đã làm gì sai trên sql với tham gia?

+2

Bạn không thể thực hiện 'SELECT *' trong truy vấn phụ như vậy; phần 'c.code NOT IN' đang tìm kiếm một cloumn duy nhất được trả về. – LittleBobbyTables

+0

Cảm ơn bạn. Cảm ơn tất cả. :) –

+0

Có vẻ như điều này đã được giải quyết, nhưng nếu bạn vẫn cân nhắc việc cập nhật câu hỏi của mình bằng một câu lệnh sqlfiddle. – Strawberry

Trả lời

7

Đối với không trong truy vấn phụ - nó nên chứa chỉ một cột - ví dụ

SELECT * FROM `employee_activities` a 
LEFT JOIN `activity` b ON a.activity_code = b.code 
LEFT JOIN `employees` c ON a.employee_code = c.code 
WHERE b.type = "Design" 
AND c.code NOT IN(
    SELECT b.employee_code FROM `employee_activities` a 
     LEFT JOIN `activity` b ON a.activity_code = b.code 
     LEFT JOIN `employees` c ON a.employee_code = c.code 
     WHERE b.type = "Testing" 
) 
GROUP BY c.code 
+0

ooops. vâng tôi xấu. Không thấy điều đó. Cảm ơn. –

2

Vấn đề của bạn là trong phần này:

AND c.code NOT IN(
SELECT * FROM 

Bạn không thể có một * ở đây là nó đang tìm kiếm xem liệu c.code có nằm trong danh sách các giá trị trường được trả về và phải chỉ định một trường duy nhất trong phần chọn.

2

Vấn đề là trong phần này:

AND c.code NOT IN( 
    SELECT * FROM `employee_activities` a 

Bạn không thể SELECT * trong truy vấn lồng nhau. Bạn cần phải chọn chính xác một cột sẽ được so sánh với c.code. Bạn cần điều này thay vì:

AND c.code NOT IN( 
    SELECT c.code FROM `employee_activities` a 
3

truy vấn của bạn

AND c.code NOT IN(
    SELECT * FROM `employee_activities` a 
... 

cố gắng để so sánh c.code để tất cả các cột trong subquery. Những gì bạn muốn có lẽ là;

AND c.code NOT IN(
    SELECT c.code FROM `employee_activities` a 

Ngoài ra, bạn gặp sự cố trong số LEFT JOIN;

LEFT JOIN `activity` b ON a.activity_code = b.code 
... 
WHERE b.type = "Design" 

Khi bạn so sánh một cột được trái tham gia vào một điều khoản WHERE, nó về cơ bản biến toàn bộ tham gia vào một INNER JOIN. Vì truy vấn ban đầu của bạn dường như sử dụng một phép nối bên trong, nên nó sẽ ổn, nhưng bạn cũng có thể thay đổi nó thành;

SELECT * FROM `employee_activities` a 
JOIN `activity` b ON a.activity_code = b.code AND b.type='Design' 
LEFT JOIN `employees` c ON a.employee_code = c.code 
2

DO này:

SELECT * FROM `employee_activities` a 
LEFT JOIN `activity` b ON a.activity_code = b.code 
LEFT JOIN `employees` c ON a.employee_code = c.code 
WHERE b.type = "Design" 
AND c.code NOT IN(
    SELECT c.code FROM `employee_activities` a 
     LEFT JOIN `activity` b ON a.activity_code = b.code 
     LEFT JOIN `employees` c ON a.employee_code = c.code 
     WHERE b.type = "Testing" 
) 
GROUP BY c.code 

Như ở đây bạn nên so sánh dữ liệu với cột mã và * sẽ lấy tất cả các hồ sơ.

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