2013-06-28 29 views
5

我有這個疑問:使用時,遇到了一個錯誤聯接查詢

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 

我得到這個錯誤:

#1241 - Operand should contain 1 column(s) 

我綁得有至少一個活動的所有員工鍵入「設計」和無「活動」類型的「測試」。

我有一個查詢可以工作,但我希望它能與連接一起工作。

這工作:

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 

我做了什麼錯上加入SQL?

+2

你不能在子查詢中這樣做SELECT *; 'c.code NOT IN'部分正在尋找一個單一的圖層來返回。 – LittleBobbyTables

+0

謝謝。謝謝你們。 :) –

+0

這聽起來像是解決了,但如果你仍然考慮用sqlfiddle更新你的問題。 – Strawberry

回答

7

對於未在子查詢 - 它應該只包含一列 - 例如

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。是的,我的壞。沒有看到。謝謝。 –

2

你的問題是,在這一部分:

AND c.code NOT IN(
SELECT * FROM 

你不能有一個*這裏它查看c.code是否在返回的字段值列表中,並且必須在select中指定一個單獨的字段。

2

問題是,在本節:

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

你不能在嵌套查詢SELECT *。您需要精確選擇一列,並將其與c.code進行比較。你需要這個來代替:

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

您的查詢

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

試圖c.code在子查詢比較所有列。你想要的可能是;

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

此外,您在您的LEFT JOIN;

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

當你比較,只剩加入了爲WHERE條款列,它基本上變成了整個加入到INNER JOIN。由於您的原始查詢似乎使用內部連接,所以應該沒問題,但您可以將其更改爲;

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

做到這一點:

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 

如這裏你應該將數據與代碼列比較和*將獲取的所有記錄。