我想更新表格的同一列,针对一次拍摄中的不同情况。我能做到这一点的最佳方式是什么?例如,我想在一个SQL查询中实现与以下语句相同的东西:
UPDATE DANCER_TYPE SET TYPE = 'BALLET' WHERE LOGIN = 'arachel';
UPDATE DANCER_TYPE SET TYPE = 'EXOTIC_BELLY_DANCER' WHERE LOGIN = 'mandanah';
UPDATE DANCER_TYPE SET TYPE = 'JAZZ' WHERE LOGIN = 'kbianca';
UPDATE DANCER_TYPE SET TYPE = 'FUSION' WHERE LOGIN = 'lmorgan';
UPDATE DANCER_TYPE SET TYPE = 'BOLLYWOOD' WHERE LOGIN = 'idcruz';
UPDATE DANCER_TYPE SET TYPE = 'SAMBA' WHERE LOGIN = 'pcastillo';
使用单个查询以最可扩展和最有效的方式更新DANCER_TYPE列的最佳方法是什么?
答案 0 :(得分:2)
Use CASE - EXPRESSION
UPDATE DANCER_TYPE
SET TYPE = CASE WHEN LOGIN = 'arachel' THEN 'BALLET'
WHEN LOGIN = 'mandanah' THEN 'EXOTIC_BELLY_DANCER'
WHEN LOGIN = 'kbianca' THEN 'JAZZ'
WHEN LOGIN = 'lmorgan' THEN 'FUSION'
WHEN LOGIN = 'idcruz' THEN 'BOLLYWOOD'
WHEN LOGIN = 'pcastillo' THEN 'SAMBA'
END
WHERE LOGIN IN ('arachel', 'mandanah','kbianca','lmorgan','idcruz''pcastillo');
答案 1 :(得分:2)
UPDATE DANCER_TYPE
SET TYPE = CASE LOGIN
WHEN 'arachel' THEN 'BALLET'
WHEN 'mandanah' THEN 'EXOTIX_BELLY_DANCER'
ELSE 'YOURELSEVALUE'
END;
should work for your case (only did 2 examples)
答案 2 :(得分:2)
Everyone here gave an answer based on the 'one query' request. They are all right. you need to use a case
statement AND the where
condition.
For the 'efficient manner' part of your question, you have to add an INDEX
on the login
field if you don't have it already.
So, it would be:
create index IDX_DANCER_TYPE_LOGIN on DANCER_TYPE(login);
And use the answer from @SamiKuhmonen
UPDATE DANCER_TYPE SET TYPE = CASE login
WHEN 'arachel' THEN 'BALLET'
WHEN 'mandanah' THEN 'EXOTIC_BELLY_DANCER'
...
END
WHERE login IN ('arachel', 'mandanah', ...);
Plus his explanation on the else
IN MY OPINION there is no more scaleable way
then run the updates separated with the index created.
答案 3 :(得分:1)
The definition of "best", "most scalable" and "most efficient" can have very different meanings. You'll have to define them first. Superlatives don't work well.
But if you want a single query you can use CASE
:
UPDATE DANCER_TYPE SET TYPE = CASE login
WHEN 'arachel' THEN 'BALLET'
WHEN 'mandanah' THEN 'EXOTIC_BELLY_DANCER'
...
END
WHERE login IN ('arachel', 'mandanah', ...);
The WHERE
condition to make sure you don't update unnecessary fields. Depending on RDBMS implementation you might get away with just ELSE type
and no WHERE
condition.
答案 4 :(得分:0)
假设您使用的是InnoDB,在单个事务中执行UPDATEs
会因xaction开销而有所帮助:
BEGIN;
UPDATE ...
UPDATE ...
...
COMMIT;
可能使用其他答案中提及的CASE
和WHERE
比此更快。