2012-03-14 39 views
9

似たような疑問がたくさんありますが、私の問題は本当の解決策ではありません。MySQLエラー "オペランドには1列が含まれているはずです"

私のSQLクエリ:私はちょうどそれが動作括弧でクエリを使用して結果が

ID | COUNTER 
0002159 | 1 

ある場合

UPDATE ADRESSEN 
SET EMAIL = 0 
WHERE ID = (SELECT ID, COUNT(ID) AS COUNTER 
FROM EIGENSCHAFTEN WHERE Kategorie = "BOUNCE" 
GROUP BY ID 
HAVING COUNTER = 1) 

私が受け取ったエラーコードが

#1241 - Operand should contain 1 column(s) 

です私のエラーはどこですか? ありがとうございました。

+0

Urサブクエリは2つの列を返すので、有効ではありません。 – Teja

答えて

0
WHERE ID IN (SELECT ID 
       FROM EIGENSCHAFTEN 
       WHERE Kategorie = "BOUNCE" 
       GROUP BY ID 
       HAVING COUNT(*) = 1) 
1

問題は、あなたのサブクエリである:

SELECT ID, COUNT(ID) AS COUNTER FROM EIGENSCHAFTEN WHERE Kategorie = "BOUNCE" GROUP BY ID HAVING COUNTER = 1 

あなたはIDと比較しようとしているが、あなたのサブクエリは、2つの列を含む2列

2

を戻ってきています。これを試してみてください:

UPDATE ADRESSEN 
SET EMAIL = 0 
WHERE ID = (SELECT ID 
FROM EIGENSCHAFTEN WHERE Kategorie = "BOUNCE" 
GROUP BY ID 
HAVING COUNT(ID) = 1) 

私はあなただけのIDを選択するので、COUNT(ID)を除去し、あなたのHAVING句で代わりにそれを置きます。

また、このクエリで複数の行が返されることがない場合は、重複の可能性に対処する必要があります。 WHERE ID =ではなくWHERE ID INに変更するか、クエリによって返される結果の数を制限してください。結果を制限する方法は、あなたの必要条件に依存します。サブクエリにLIMIT 1を追加すると効果がありますが、並べ替えを行うか、MIN/MAXを使って取得することができます。

0
UPDATE ADRESSEN 
SET EMAIL = 0 
WHERE ID = (SELECT ID 
FROM EIGENSCHAFTEN WHERE Kategorie = "BOUNCE" 
GROUP BY ID 
HAVING COUNT(*) = 1) 
10

問題は内部クエリが2つの列を返すことです。クエリを次のように変更してください

UPDATE ADRESSEN 
SET EMAIL = 0 
WHERE ID = (SELECT ID 
FROM EIGENSCHAFTEN WHERE Kategorie = "BOUNCE" 
GROUP BY ID 
HAVING COUNT(ID) = 1) 

これは動作するはずです。

もう1つの提案があります。内側のクエリが常に1つの行を返すことを確認してください。 内部クエリによって返された複数のIDに対してEMAILを値0で設定する場合は、「=」ではなく「IN」を使用することをお勧めします。

関連する問題