通常の更新操作ではニーズを満たせなくなることがあり、さまざまな条件に応じて特定の更新を行う必要があります。たとえば、フィールドは通常どおり直接更新され、他のフィールドは条件に応じて更新する必要があります。以下の例を参照してください。
元のテーブルデータ:
要求する:
1.すべてのレコードで、IS_ENABLEフィールドが1に変更されます。
2. IDが最大のレコードの場合、IS_ENABLE時刻は「2017-09-0909:09:09」に変更され、残りのレコードの場合、時刻は「2017-01-01 00:」に変更されます。 00:00 "
SQLステートメントは次のとおりです。
update t_iov_user_car_info set IS_ENABLE=1,
LAST_UPDATED_DATE=
(
case when id=(select a.id from (select max(id) id from t_iov_user_car_info uc where uc.USER_ID_CARD=4) a)
then '2017-09-09 09:09:09'
else '2017-01-01 00:00:00' end
)
where USER_ID_CARD=4
結果:
ご覧のとおり、IS_ENABLEフィールドデータはすべて1に変更されています。これが通常の変更操作です。
その他のレコードの場合、時刻は2017-01-01 00:00:00に変更され、最大ID(id = 233)のレコードの場合、時刻は次のように変更されました:2017-09-09 09:09: 09。
これは特定の更新を行うためです。
SQL分析:
それらの中で、ステートメント:
select max(id) id from t_iov_user_car_info uc where uc.USER_ID_CARD=4
最大のIDを照会することです。では、なぜこのステートメントの前に追加するのですか?
からa.idを選択しますか?これは、mysqlが最初に同じテーブル内のいくつかの値を選択してから(同じステートメント内で)このテーブルを更新できないためです。そうしないと、エラーが報告されます。
「FROM句で更新対象のテーブルを指定することはできません」。
解決策は、エラーを回避するために、中間テーブルを介して選択の結果を再度選択することです。
この問題はmysqlでのみ発生し、mssqlとoracleではこの問題が発生しないことに注意してください。
次のSQLステートメント:
LAST_UPDATED_DATE=
(
case when id=(select a.id from (select max(id) id from t_iov_user_car_info uc where uc.USER_ID_CARD=4) a)
then '2017-09-09 09:09:09'
else '2017-01-01 00:00:00' end
)
その意味は非常に明確で、Javaコードと同等です。
if(id=最大){
LAST_UPDATED_DATE='2017-09-09 09:09:09' ;
}else{
LAST_UPDATED_DATE='2017-01-01 00:00:00' ;
}
OK、それだけです。