13

我想在其他表的外键的帮助下更新一个表。

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

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)
4

5 回答 5

7

我认为以下任何一项都可以:

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)
于 2012-04-05T11:33:24.580 回答
4

这是因为 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 语句返回的单个记录和多个记录。

于 2012-04-05T11:26:41.247 回答
3

您还可以使用 INSERT OR REPLACE 语句,如下所示:

假设 tbl_1 有 4 列:key、field1、field2、field3
并且您想使用 tbl_2 中的匹配值更新 field2

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
于 2013-03-15T04:38:22.963 回答
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)
于 2012-04-05T11:27:06.657 回答
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)

sqllite 不支持加入更新查询。所以这是选项之一

于 2012-04-05T11:27:43.420 回答