2012-04-05 39 views
9

Tôi muốn cập nhật một bảng với sự giúp đỡ của khóa ngoại của bảng khác.Làm thế nào tôi có thể cập nhật bảng bằng cách sử dụng lựa chọn công bố trong SQLite

Tôi cố gắng để làm một cái gì đó như thế này:

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) 

HOẶC

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

Mệnh đề SELECT của bạn trả về bao nhiêu giá trị? – Teja

+1

Ở phần thứ hai, tôi chắc chắn bạn chỉ cần thay đổi 'WHERE Field3 = (SELECT ...' thành 'WHERE Field3 IN (SELECT ...', và trong phần đầu tiên tôi nghĩ bạn cần thay đổi 'WHERE Field3 = (SELECT..' đến 'WHERE EXISTS (SELECT ...') – GarethD

Trả lời

6

Tôi nghĩ rằng một trong những điều sau đây sẽ làm việc:

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 
     ) 

HOẶC

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

Cả hai đều đang làm việc nhưng sqllite chỉ hỗ trợ đầu tiên .. Cảm ơn rất nhiều ... :) – Nidhi

+0

Đừng lo, nhưng không có lý do thứ hai không nên làm việc trên SQLLite. tôi đã thử nghiệm các giải pháp sử dụng này [Fiddle] (http://sqlfiddle.com/#!5/e05bf/4) – GarethD

4

Điều này là do SELECT trả về nhiều hơn một dòng. Làm điều này thay vì:

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

Khi SELECT trả về một bảng (hoặc nhiều hàng) IN được sử dụng. Nếu bạn chắc chắn truy vấn bên trong chỉ trả lại một hàng, thì bạn sẽ phải điều chỉnh truy vấn bên trong tương ứng. Như thế này hay như vậy:

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

nó an toàn hơn để sử dụng IN đây 'cos nó có thể xử lý cả hai hồ sơ duy nhất và nhiều kỷ lục trở về từ câu lệnh SELECT.

+0

Trả về nhiều hơn một 'bản ghi'? – MatBailie

+0

@ Có, tôi cập nhật :) – nawfal

0

Đối với Giá trị đơn:

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) 

Đối với nhiều giá trị

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

Bạn có thể sử dụng như

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 này không hỗ trợ tham gia trong bản cập nhật truy vấn. vì vậy đây là một trong những lựa chọn

3

Bạn cũng có thể sử dụng một INSERT OR REPLACE tuyên bố, một cái gì đó như như sau:

Giả sử tbl_1 có 4 cột: khóa, trường1, trường2, trường 3
và bạn muốn cập nhật trường 2 với giá trị khớp từ 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 
+1

Lưu ý rằng một thao tác 'INSERT OR REPLACE' sẽ gọi' DELETE' trên bất kỳ hàng nào trước khi chúng được chèn vào nếu chúng tồn tại. – drglove

Các vấn đề liên quan