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)

タイプ「設計」のアクティビティが少なくとも 1 つあり、タイプ「テスト」のアクティビティがないすべての従業員を取得しようとしています。

機能するクエリがありますが、結合で機能させたいと思います。

これは機能します:

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 で何が間違っていましたか?

4

5 に答える 5

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
于 2013-06-28T12:49:36.047 に答える
2

問題は次のセクションにあります。

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

SELECT *そのネストされたクエリではできません。と比較する列を 1 つだけ選択する必要がありますc.code。代わりにこれが必要です:

AND c.code NOT IN( 
    SELECT c.code FROM `employee_activities` a
于 2013-06-28T12:49:23.137 に答える
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

ここでは、データをコード列と比較する必要があり、* はすべてのレコードを取得します。

于 2013-06-28T12:50:48.550 に答える