如果"子查询返回超过1行",则将其视为NULL

Cai*_*ias 3 mysql sql mysql-error-1242

我正在尝试将newtable上的商店ID与来自维护者的ID同步:

UPDATE newtable t SET t.store_id = (SELECT store_id FROM maintable s 
WHERE t.state = s.state AND s.city = t.city AND t.name = s.name)
Run Code Online (Sandbox Code Playgroud)

每当子查询返回多行时,它就会出现"Subquery返回超过1行"的错误,但是当它返回零行时,子查询被认为没有返回任何内容,因此newtable上的store_id保持为NULL.这里没有什么新东西,它只是它的工作原理.

我想知道是否可以让子查询输出与没有匹配时的子查询输出相同,当它有多个匹配行时.

这样我就可以让store_id只为主表上的一个匹配行同步,并在子查询中出现多个匹配行时跳过.

mu *_*ort 6

我想你可能正在寻找一个HAVING子句来强制查询恰好匹配一次:

UPDATE newtable t
SET t.store_id = (
    SELECT store_id
    FROM maintable s
    WHERE t.state = s.state
      AND s.city  = t.city
      AND t.name = s.name
    HAVING COUNT(*) = 1
)
Run Code Online (Sandbox Code Playgroud)

这应该使多个匹配行为与没有匹配相同.HAVING子句几乎应用于查询过程的最后; 如果没有来自WHERE或多个匹配的匹配,那么COUNT(*) = 1将失败并且内部查询将不返回任何内容,但如果只有一行COUNT(*) = 1则会成功,内部查询将返回该单个匹配.