如何使用sqlite更新连接表?

问题描述 投票:0回答:1

我读过很多类似的帖子,但仍然无法使其工作。

我有 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,不是吗??

sqlite
1个回答
0
投票

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 = ''
);
© www.soinside.com 2019 - 2024. All rights reserved.