2012-04-05 47 views
9

我想借助其他表的外鍵更新一個表。如何在SQLite中使用select語句更新表

我試圖做這樣的事情:

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) 

OR

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

SELECT子句返回多少個值? – Teja 2012-04-05 11:25:34

+1

在第二個我很確定你只需要改變'WHERE Field3 =(SELECT ...'到'WHERE Field3 IN(SELECT ...',在第一個我認爲你需要改變'Where Field3 =(SELECT..'爲'WHERE EXISTS(SELECT ...') – GarethD 2012-04-05 11:26:03

回答

6

我認爲以下情況之一將工作中的一項:

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 
     ) 

OR

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

兩者都是工作,但sqllite只支持第一個.. 非常感謝... :) – Nidhi 2012-04-05 12:15:19

+0

不用擔心,但沒有理由,第二個不應該在SQLLite上工作。我使用這個[Fiddle](http://sqlfiddle.com/#!5/e05bf/4) – GarethD 2012-04-05 12:22:13

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語句返回。

+0

返回多個'record'? – MatBailie 2012-04-05 11:30:30

+0

@Dems是的,我更新:) – nawfal 2012-04-05 11:30:59

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) 

sqllite不支持加入更新查詢。所以這是選項

3

您還可以使用INSERT或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 
+1

請注意,如果INSERT OR REPLACE操作存在,INSERT OR REPLACE操作會在插入任何行之前調用DELETE,例如,如果您有級聯刪除操作,則執行此操作可能會給您帶來不必要的副作用,如破壞數據。 – drglove 2016-08-25 01:36:01