12

dateOfBirth次のクエリは、 に設定された単一のエントリがある場合にのみ機能するよう1975-02-28です。

この条件に一致するレコードが複数ある場合は失敗します。

サブクエリを使用せずに、属性dateOfBirthが に設定されているユーザーのアドレスをすべて削除することはできますか?1975-02-28

SELECT @id:=(SELECT id
             FROM USER
             WHERE dateOfBirth='1975-02-28');
DELETE FROM Address
WHERE user_id=@id;

私が得る正確なエラーは次のとおりError Code: 1242 Subquery returns more than 1 row.です。

4

3 に答える 3

4

このエラーは、id を変数に割り当てようとしたときに、内部クエリが単一の行を返さないことを意味します。

SELECT id
FROM USER
WHERE dateOfBirth='1975-02-28'

クエリを介して変数に値を割り当てると、常に単一行の結果になるはずです。複数列の結果を保存する場合は、次のようにします。

SELECT field_1, field_2, field_3 INTO @var_a, @var_b, @var_c FROM any_table

しかし、あなたがこれを尋ねたので:

サブクエリを使用せずに、属性dateOfBirthが に設定されているユーザーのアドレスをすべて削除することはできますか?1975-02-28

Tonio が言ったように、DELETE クエリを彼の提案に変更するとうまくいきます。

DELETE FROM Address WHERE user_id IN (SELECT id FROM USER WHERE dateOfBirth='1975-02-28');

于 2015-09-01T13:53:29.860 に答える
1

そのようなエントリが複数ある場合、SELECTサブクエリは ID のテーブルを返します。

ID をテーブルと同じにすることはできません。これを試して:

DELETE FROM Address
WHERE user_id IN (SELECT id
                  FROM USER
                  WHERE dateOfBirth='1975-02-28');

編集:

次のクエリで試みられているように、MySQL 変数内に複数の値を格納することはできないようです。

SELECT @ids:=(SELECT id
              FROM USER
              WHERE dateOfBirth='1975-02-28');

この説明は主に、これを書いている多くの人々に基づいています (「私の知る限り」という言及によって修飾されることがよくあります)。

そのような答えをたくさん見つけることができましたが、その主張に反するページはありませんでした. これらの回答のいくつかの例は SO にあります (例: https://stackoverflow.com/a/3156565/3401018 )。

私はそれが真実である可能性が非常に高いと信じがちです. いずれにせよ、私の回答の最初の部分でわかるように、この特定のケースでは実際に変数を調べる必要はありません。

于 2014-07-03T11:43:39.467 に答える