Mysql - 根据重复的 Table_1 值更新某些 Table_2 值
Posted
技术标签:
【中文标题】Mysql - 根据重复的 Table_1 值更新某些 Table_2 值【英文标题】:Mysql - Update certain Table_2 values depending on duplicate Table_1 values 【发布时间】:2013-12-18 01:48:44 【问题描述】:我有两张桌子 - Table_1 和 Table_2。
它们具有相同的列 - Col1、Col2、Col3、Col4(整数)。
表 2 有一行包含以下值:
Col1,Col2,Col3,Col4
1) a ,b ,0 ,0 (From Table_1)
Table_1 具有与 Col1 和 Col2 对应的重复值。
例如:
Col1,Col2,Col3,Col4
1) a ,b ,0 ,1 (From Table_1)
2) a ,b ,1 ,0 (From Table_1)
3) a ,b ,0 ,0 (From Table_1)
Col4(第 1 行)有一个“1”,Col3(第 2 行)有一个“1”。
当 Table_1 中的 Table_2 行的重复项的任何一列有 1 时,将 1 应用于相应列。
所以 Table_2 的最终值将是:
Col1,Col2,Col3,Col4
1) a ,b ,1 ,1 (From Table_1)
我试过了
UPDATE Table_2 JOIN
Table_1 ur
ON Table_1.Col1 = Table_2.Col1 and Table_1.Col2 = Table_2.Col2
SET Table_2.Col3 = if(Table_1.Col3 = 1,1,Col3), Table_2.Col4 = if(Table_1.Col4 = 1,1,Col4)
但它给了我以下结果:
Col1,Col2,Col3,Col4
1) a ,b ,0 ,1 (From Table_1)
这意味着它只考虑第一个匹配项。如何考虑 Table_1 中的所有匹配项?
【问题讨论】:
我删除了 SQL Server 标签,因为您使用的是 mysql 语法。 【参考方案1】:我很惊讶你的update
工作,考虑到列名的歧义。尝试使用显式表别名:
UPDATE Table_2 JOIN
Table_1 ur
ON ur.Col1 = Table_2.Col1 and ur.Col2 = Table_2.Col2
SET Col3 = if(ur.Col3 = 1, 1, Table_2.Col3),
Col4 = if(ur.Col4 = 1, 1, Table_2.Col4);
或者,一个更简单的公式(假设值始终为 0 和 1):
UPDATE Table_2 JOIN
Table_1 ur
ON ur.Col1 = Table_2.Col1 and ur.Col2 = Table_2.Col2
SET Col3 = greatest(ur.Col3, Table_2.Col3),
Col4 = greatest(ur.Col4, Table_2.Col4);
编辑:
哦,我明白了,Table_1
中有多行可用于更新。只会(任意)选择其中一行进行更新。在这种情况下,您需要预先聚合表。
UPDATE Table_2 JOIN
(select col1, col2, max(col3) as col3, max(col4) as col4
from Table_1
group by col1, col2
) ur
ON ur.Col1 = Table_2.Col1 and ur.Col2 = Table_2.Col2
SET Col3 = greatest(ur.Col3, Table_2.Col3),
Col4 = greatest(ur.Col4, Table_2.Col4);
【讨论】:
戈登,我试过上面的说法,但它给我的结果和以前一样。 @zenCoder 。 . .请参阅修改后的答案。我错过了问题的关键点。 两个表都有大约 150 万行。有没有办法可以优化您更新的查询?我开始查询已经过去了大约 7 个小时。 @zenCoder 。 . .Table_2(col1, col2)
上的索引可能会有所帮助。您也可以尝试在Table_1(col1, col2)
上建立索引,但我认为 MySQL 不会将其用于聚合。以上是关于Mysql - 根据重复的 Table_1 值更新某些 Table_2 值的主要内容,如果未能解决你的问题,请参考以下文章