我有一个表格,用于存储不同组的数据,如果一列中的值匹配,我需要更新一个组。
表格如下:
prop_id | group_id | value | visible
1 | 1 | 10 | 1
1 | 2 | 10 | 1
1 | 3 | 15 | 1
2 | 1 | 10 | 1
2 | 2 | 10 | 1
2 | 3 | 10 | 1
如果visible
列中的值等于0
,我想将group_id=3
列设置为value
group_id=1
。在这种情况下,如果value=10
group_id=1 and group_id=3
visible=0
而不是group_id=3
prop_id | group_id | value | visible
1 | 1 | 10 | 1
1 | 2 | 10 | 1
1 | 3 | 15 | 1
2 | 1 | 10 | 1
2 | 2 | 10 | 1
2 | 3 | 10 | 0
更新后的预期结果
nlme
这怎么可能?
答案 0 :(得分:1)
首先将其写为SELECT
。
从简单开始,我们知道要更新的行是group_id=3
和visible=1
,因此请编写一个获取所有这些行的查询:
SELECT g3.value
, g3.visible
FROM mytable g3
WHERE g3.group_id = 3
AND g3.visible = 1
我们知道要更新的行在该集合中,但还有一些其他条件。
所以我们延伸它。根据规范,我们需要查明是否有group_id=1
行匹配visible=1
(匹配value
)。
我们可以使用EXISTS
相关子查询来检查,或者我们可以使用JOIN
。
SELECT g3.group_id
, g3.value
, g3.visible
FROM mytable g3
WHERE g3.group_id = 3
AND g3.visible = 1
AND EXISTS ( SELECT 1
FROM mytable g1
WHERE g1.group_id = 1
AND g1.visible = 1
AND g1.value = g3.value
)
- 或 -
SELECT g3.group_id
, g3.value
, g3.visible
FROM mytable g3
JOIN mytable g1
ON g1.group_id = 1
AND g1.visible = 1
AND g1.value = g3.value
WHERE g3.group_id = 3
AND g3.visible = 1
在特定条件下验证查询是否返回我们要更新的行。 (验证SELECT
语句的结果并根据需要进行调整要比UPDATE
语句更容易。)
一旦我们有SELECT
查询工作并验证(返回我们想要更新的行),我们就可以将其转换为UPDATE
语句。将SELECT ... FROM
替换为UPDATE
并添加一个返回行的SET
子句
UPDATE mytable g3
JOIN mytable g1
ON g1.group_id = 1
AND g1.visible = 1
AND g1.value = g3.value
SET g3.visible = 0
WHERE g3.group_id = 3
AND g3.visible = 1
答案 1 :(得分:0)
使用Self JOIN
然后UPDATE
你可以试试这个。
UPDATE T t1
JOIN T t2 on t1.group_id = t2.group_id
and t1.rop_id<>t2.rop_id and t1.value > t2.value
SET t2.visible = 0
sqlfiddle:http://sqlfiddle.com/#!9/6f06de/1