基于另一个字段的子查询更新字段

3

我使用MySQL数据库,并且想根据另一个字段更新表中的某个字段。类似于:

UPDATE table1
SET field1 = table2.id
WHERE field2 IN (
    SELECT table2.name
    FROM table2
    );

我知道这个查询不会起作用,但这是一个想法。它有可能实现吗?
1个回答

4

您可以使用以下方式作为相关子查询。这假定将返回完全匹配的值。如果返回多个匹配值,它将引发错误,如果返回零个,则将字段设置为空。如果不希望出现最后一种行为,则需要使用where子句。

UPDATE table1
SET field1 = (SELECT DISTINCT table2.ValueColumn 
              FROM table2 
              WHERE table2.JoinColumn = table1.JoinColumn)

编辑

要查看具有0或多个匹配项的记录,您可以使用以下方法:

SELECT table1.JoinColumn, COUNT(DISTINCT table2.ValueColumn)
FROM table1 
LEFT JOIN table2
ON table2.JoinColumn = table1.JoinColumn
GROUP BY table1.JoinColumn
HAVING COUNT(DISTINCT table2.ValueColumn) <> 1

在您的另一个表中,某些值可能会有多个可能的结果。您想如何处理这些情况? - Martin Smith
@Martin:是的,输出就是这样说的,但我在列名上尝试了count(),并且没有任何值重复。真的很奇怪,我不知道它怎么会返回多个值。 - Nicolas
@Martin:MySQL返回了一个空结果集(即零行)。 (查询耗时0.1746秒) - Nicolas
好的,如果我找到答案的话,我会尽快更新这个问题。无论如何,谢谢 :) - Nicolas
@Nicolas 你可以使用聚合函数来确保子查询只返回一个值,但我非常犹豫建议这样做,因为它可能只是掩盖了你尚未发现的问题。 - Martin Smith
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接