如何在SQLite中使用SELECT语句更新表格

14

我想通过其他表的外键来更新一个表。

我正在尝试做这样的事情:

UPDATE tbl_1 
SET field1 = 6, field12 = NULL 
WHERE field3 = (SELECT tbl_2.item1 
                FROM tbl_1, tbl_2 
                WHERE tbl_1.field3 = tbl_2.item1 AND tbl_2.item2 = 135)

UPDATE tbl_1 
SET field1 = 6, field12 = NULL 
WHERE field3 = (SELECT item1 FROM tbl_2 WHERE item2 = 135)

你的 SELECT 子句会返回多少个值? - Teja
1
在第二个问题中,我相信你只需要将 WHERE Field3 = (SELECT... 改为 WHERE Field3 IN (SELECT ...,而在第一个问题中,我认为你需要将 WHERE Field3 = (SELECT.. 改为 WHERE EXISTS (SELECT ...)。 - GarethD
5个回答

8
我认为以下两种方法都可以实现:

方法一:

方法二:

UPDATE  tbl_1 
SET     field1 = 6, field12 = NULL 
WHERE   EXISTS 
        (   SELECT 1
            FROM tbl_2 
            WHERE tbl_1.field3 = tbl_2.item1 
            AND tbl_2.item2 = 135
        )

或者

UPDATE  tbl_1 
SET     field1 = 6, field12 = NULL 
WHERE   field3 IN (SELECT item1 FROM tbl_2 WHERE item2 = 135)

2
两种方法都可以工作,但是SQLite只支持第一种方法。非常感谢... :) - Nidhi
没问题,但第二种方法在SQLLite上也应该可以工作。我使用这个Fiddle测试了这些解决方案。 - GarethD

5
这是因为SELECT返回了多行结果。请改用以下方法:
UPDATE tbl_1 SET field1 = 6, field12 = NULL 
WHERE field3 IN (SELECT item1 FROM tbl_2 WHERE item2 = 135)

SELECT返回一个表格(或多行)时,需要使用IN。如果您确定内部查询只应返回一行,则必须相应地调整内部查询。像这样或者这样:

UPDATE tbl_1 SET field1 = 6, field12 = NULL 
WHERE field3 = (SELECT item1 FROM tbl_2 WHERE item2 = 135 ORDER BY myValue LIMIT 1)

在这里使用IN更安全,因为它可以处理从SELECT语句返回的单个记录和多个记录。


返回多个“记录”? - MatBailie

3
您还可以使用INSERT OR REPLACE语句,例如以下内容:
假设tbl_1有4个列:key、field1、field2、field3, 您想要将field2更新为tbl_2中匹配的值。
INSERT OR REPLACE INTO tbl_1
SELECT tbl_1.key, tbl_1.field1, tbl_2.value, tbl_1.field3
FROM tbl_1 JOIN tbl_2 ON tbl_2.key = tbl_1.key

2
请注意,“INSERT OR REPLACE”操作将在插入之前调用DELETE以删除任何现有的行。例如,如果您有级联删除,则执行此操作可能会产生不需要的副作用,如破坏您的数据。 - drglove

0

针对单个值:

UPDATE tbl_1 
SET field1 = 6, field12 = NULL 
WHERE field3 = (SELECT tbl_2.item1 
                FROM tbl_1, tbl_2 
                WHERE tbl_1.field3 = tbl_2.item1 AND tbl_2.item2 = 135)

对于多个值

UPDATE tbl_1 
SET field1 = 6, field12 = NULL 
WHERE field3 IN (SELECT tbl_2.item1 
                FROM tbl_1, tbl_2 
                WHERE tbl_1.field3 = tbl_2.item1 AND tbl_2.item2 = 135)

0

你可以像这样使用

UPDATE tbl_1 
SET field1 = 6, field12 = NULL 
WHERE field3 in (SELECT tbl_2.item1 
                FROM tbl_1, tbl_2 
                WHERE tbl_1.field3 = tbl_2.item1 AND tbl_2.item2 = 135)

SQLite不支持在更新查询中使用JOIN,因此这是其中一种选项。


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