8

MySQLで次のことを実行しようとしています。

UPDATE
    x
SET
    y = COALESCE(SELECT z FROM table WHERE a = b AND c = d AND e = f LIMIT 1,
                 SELECT z FROM table WHERE a = b AND c = d LIMIT 1,
                 SELECT z FROM table WHERE a = b LIMIT 1);

それは私には非常に有効に聞こえます。最適な値で列を更新しようとしています。3つの基準に一致するレコードが見つかった場合->それが必要なレコードです。それ以外の場合は、2つの基準に適合するもの、それ以外の場合は1つの基準にのみ一致するレコード。

これは3つの更新クエリで実行できますが、なぜこれが機能しないのかわかりません。マニュアルによると:

COALESCE returns the first non-NULL value in the list, or NULL if there are no non-NULL values.

それがまさに私が必要としていることです。ただし、次のエラーが発生します。

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT'

ここで何かが足りませんか?

4

2 に答える 2

9

あなたの問題はおそらく、副選択によって返される1つ以上のz値を取得していることです。入手できるのは1つだけです。

あなたは試すことができます:

update x
set y = (select z from t where a = b
         order by (case when a = b and c = d and e = f then 1
                        when a = b and c = d then 2
                        else 3
                   end)
         limit 1
        );

ただし、特定の構文エラーは、selectを括弧で囲む必要があることです。したがって、これは構文的に正しいバージョンです。

UPDATE
    x
SET
    y = COALESCE((SELECT z FROM table WHERE a = b AND c = d AND e = f LIMIT 1),
                 (SELECT z FROM table WHERE a = b AND c = d LIMIT 1),
                 (SELECT z FROM table WHERE a = b LIMIT 1));
于 2013-03-26T13:14:23.520 に答える
1

詳細なしでアドバイスするのは難しいですが、このようなものはうまくいくかもしれません

UPDATE
    x
SET y = COALESCE(
    ( SELECT z FROM table WHERE a = b AND c = d AND e = f LIMIT 1),
    ( SELECT z FROM table WHERE a = b AND c = d LIMIT 1 ),
    ( SELECT z FROM table WHERE a = b LIMIT 1 )
);

各サブクエリが最大1行のみを返すようにします。

于 2013-03-26T13:15:40.007 に答える