我有这张桌子:
它通过此查询生成SELECT DISTINCT code, tariff_diff FROM mytable
。
现在,如果tariff_diff
出现超过1,我想要更新code
= 1。(例如,我想要更新tariff_diff
= 1,其中行Kuta,DPS50xxx
)
我试过了:
update mytable SET tariff_diff = 1
WHERE in(select distinct code, tariff_diff from mytable)
但我得到错误语法。
Operand should contain 1 column
答案 0 :(得分:1)
如果你想用相同的代码改变所有行,你可以使用它。
UPDATE mytable SET mytable.tariff_diff = 1 WHERE mytable.code IN(SELECT count(*), code, tariff_diff from mytable GROUP BY code HAVING count(*)>1)
答案 1 :(得分:1)
根据我的理解,只有当存在多个以tariff_diff
为前缀的行时,您才希望将1
设置为Kuta,DPS50.
。匹配Kuta,DPS50.06
,Kuta,DPS50.07
,Kuta,DPS50.08
,Kuta,DPS50.09
,Kuta,DPS50.10
。
假设您的所有记录都格式为:XXX,xxx.###
。您可以使用SUBSTRING_INDEX
来解析带前缀的文本(Kuta,DPS50.
)以用作标识符。
然后,您可以使用派生的JOIN
来匹配具有前缀值重复的代码,并更新匹配的行。
如果没有重复值,则不会进行更新。
示例:http://sqlfiddle.com/#!9/658034/1 (我为Petang,DPS50.02
添加了一个附加条目,以证明它适用于其他前缀值。)
<强>查询:强>
UPDATE mytable AS p
JOIN (
SELECT SUBSTRING_INDEX(code, '.', 1) AS prefix_code
FROM mytable
GROUP BY prefix_code
HAVING COUNT(prefix_code) > 1
) AS c
ON c.prefix_code = SUBSTRING_INDEX(p.code, '.', 1)
SET p.tariff_diff = 1;
<强>结果:强>
| code | tariff_diff |
|-----------------------|-------------|
| Abiansemal,DPS50.02 | 0 |
| Kuta,DPS50.06 | 1 |
| Kuta,DPS50.07 | 1 |
| Kuta,DPS50.08 | 1 |
| Kuta,DPS50.09 | 1 |
| Kuta,DPS50.10 | 1 |
| Kuta Selatan,DPS50.05 | 0 |
| Kuta Ultara,DPS50.04 | 0 |
| Mengwi,DPS50.01 | 0 |
| Petang,DPS50.02 | 1 |
| Petang,DPS50.03 | 1 |
这也将避免SQL错误(1093)https://dev.mysql.com/doc/refman/5.6/en/update.html
您无法更新表并从子查询中的同一个表中进行选择。
答案 2 :(得分:1)
在子查询的select语句中无法使用相同的更新表,您可以在此链接中找到原因:Reason for not use same table in sub-query.
尝试以下查询:
SET @r_code = (select code from mytable GROUP BY code having count(code) > 1);
update mytable SET tariff_diff = 1 WHERE code in (@r_code);
您可以在此链接中找到有关变量的更多信息。More about Variables.
首先将id存储到some变量中,然后在查询中更新这些id。