我读过很多类似的帖子,但仍然无法使其工作。
我有 2 个表,“stores_bars”和“house_data”,我需要更新它们的部分连接才能以这种方式工作:
UPDATE (
SELECT good_id FROM stores_bars
INNER JOIN house_data ON SID=ID
WHERE typ = 3 AND owner = ''
)
SET good_id = 0
;
但这会引发语法错误。从字面上看,表“house_data”超过 5k 行,第二个表超过 1k 行,而选择本身只有 220 行,我需要为其分配“0”值(从该选择)。
我尝试使用 REPLACE INTO,但在这种情况下无法将 SET good_id = 0 作为另一种语法。我尝试过 UPDATE FROM 子句,但也不起作用:
UPDATE stores_bars FROM
INNER JOIN house_data ON SID=ID
WHERE typ = 3 AND owner = ''
)
SET good_id = 0
;
SQL Error: near "FROM": syntax error
是消息。
也许我想的更容易,但只是坚持这个?
编辑
根据语法,这应该有效:
UPDATE stores_bars
SET good_id = 0
FROM stores_bars
INNER JOIN house_data ON SID=ID
WHERE typ = 3 AND owner = ''
;
但事实并非如此。错误是
SQL Error: near "FROM": syntax error
。我不知道我的 sqlite 是否不是最新的 - 不知道如何更新它。有一些解决方法,我正在寻找它。
编辑2
我已经找到了正确的语法:
UPDATE stores_bars
SET good_id = NULL
WHERE SID IN
( SELECT good_id FROM stores_bars
INNER JOIN house_data ON SID=ID
WHERE typ = 3 AND owner = '' )
;
但是虽然内部查询返回 219 个结果,但整个更新给了我这样的信息:
Query OK, 24 rows affected (0.22 sec)
。
应该是219,不是吗??
UPDATE...FROM
的正确语法(需要 SQLite 3.33.0 版本)是这样的:
UPDATE stores_bars
SET good_id = 0
FROM house_data
WHERE SID = ID AND typ = 3 AND owner = '';
虽然它实际上是一个连接,但没有
JOIN
和 ON
子句。但是,最好在代码中使用表的名称/别名作为限定符。像这样的东西(虽然我不确定这些列属于哪个表):
UPDATE stores_bars AS s
SET good_id = 0 -- the updated column should not be qualified with the table's alias
FROM house_data AS h
WHERE s.SID = h.ID AND h.typ = 3 AND h.owner = '';
对于 3.33.0 之前的 SQLite 版本,请使用
EXISTS
:
UPDATE stores_bars AS s
SET good_id = 0
WHERE EXISTS (
SELECT *
FROM house_data AS h
WHERE s.SID = h.ID AND h.typ = 3 AND h.owner = ''
);