3

我正在尝试将 newtable 上的存储 id 与 maintable 中的 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)

每当子查询返回多于一行时,它就会出错,并显示“子查询返回多于 1 行”,但是当它返回零行时,子查询被认为没有返回任何内容,因此 newtable 上的 store_id 保持为 NULL。这里没有什么新东西,它就是它的工作原理。

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

这样,我将仅针对主表上的一个匹配行同步 store_id,并在子查询中出现多个匹配行时跳过。

4

3 回答 3

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
)

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

于 2011-07-13T03:16:52.943 回答
0

您可能会考虑在您的子查询中放置一个LIMIT 1以更好地实现您想要完成的任务,具体取决于您的具体需求。

否则,您应该能够通过 IF 或 CASE 获得创意:

UPDATE newtable t SET t.store_id = (
    SELECT IF(num>1, NULL, storeid) FROM (
        SELECT COUNT(*) AS num, storeid FROM maintable s WHERE t.state=s.state AND s.city=t.city AND t.name=s.name
    )
)

未经测试,但应该让你在球场上。

于 2011-07-13T02:49:18.407 回答
0
UPDATE newtable t SET t.store_id = IFNULL((SELECT store_id FROM maintable s 
WHERE t.state = s.state AND s.city = t.city AND t.name = s.name HAVING COUNT(*) = 1), t.store_id)

IFNULL(use_this_value_if_not_null,value_if_first_isnull)

于 2011-07-13T02:54:53.337 回答