2010-05-12 76 views
33

Tôi có customeraddress bảng.truy vấn cập nhật với tham gia trên hai bảng

Query:

SELECT * 
FROM addresses a, 
    customers b 
WHERE a.id = b.id 

trả 474 hồ sơ

Đối với những hồ sơ này, tôi muốn thêm các id của customer bảng vào cid của address bảng.

Ví dụ: Nếu vì kỷ lục đầu tiên id của khách hàng là 9 và id địa chỉ cũng là 9 sau đó tôi muốn chèn 9 vào cột cid của bảng địa chỉ.

tôi đã cố gắng:

UPDATE addresses a, 
     customers b 
SET a.cid = b.id 
WHERE a.id = b.id 

nhưng điều này dường như không làm việc.

Trả lời

1
update addresses set cid=id where id in (select id from customers) 
+0

Một 'kết nối 'kết hợp các cột từ một hoặc nhiều bảng, một' trong' chỉ là một danh sách các id (ngay cả khi bạn lấy chúng từ một 'lựa chọn' khác). Câu trả lời này không liên quan đến câu hỏi. – ronedg

3

chính thức, ngôn ngữ SQL không hỗ trợ lệnh JOIN hoặc mệnh đề FROM trong câu lệnh UPDATE trừ khi nó đang trong một truy vấn phụ. Do đó, cách tiếp cận ANSI ANSI sẽ là một cái gì đó giống như

Update addresses 
Set cid = (
      Select c.id 
      From customers As c 
      where c.id = a.id 
      ) 
Where Exists (
       Select 1 
       From customers As C1 
       Where C1.id = addresses.id 
       ) 

Tuy nhiên nhiều DBMS như vậy Postgres hỗ trợ việc sử dụng mệnh đề FROM trong câu lệnh UPDATE. Trong nhiều trường hợp, bạn được yêu cầu để bao gồm các bảng cập nhật và bí danh nó trong mệnh đề FROM tuy nhiên tôi không chắc chắn về Postgres:

Update addresses 
Set cid = c.id 
From addresses As a 
    Join customers As c 
     On c.id = a.id 
+4

Postgres không yêu cầu bao gồm bảng cập nhật trong mệnh đề 'FROM'. Trong thực tế, [documentation] (http://www.postgresql.org/docs/current/static/sql-update.html) nói rằng *** "bảng đích không được xuất hiện trong' from_list', trừ khi bạn có ý định tự tham gia "***. Do đó nó có thể dẫn đến kết quả sai để đề cập đến bảng trong mệnh đề 'FROM' trừ khi bạn muốn bảng tham gia với chính nó. ** N.B. ** Bạn có thể đặt tên cho bảng cập nhật trong mệnh đề 'UPDATE'. – ADTC

+0

CẢNH BÁO - Việc thực hiện cập nhật ở định dạng này sẽ nhắm mục tiêu tất cả các hàng trong bảng địa chỉ. –

+0

@RyanWilliams - Cả hai định dạng sẽ cập nhật tất cả các hàng có khách hàng, vâng. Đó là yêu cầu. – Thomas

-3

Hãy thử điều này một

UPDATE employee 
set EMPLOYEE.MAIDEN_NAME = 
    (SELECT ADD1 
    FROM EMPS 
    WHERE EMP_CODE=EMPLOYEE.EMP_CODE); 
WHERE EMPLOYEE.EMP_CODE >='00' 
AND EMPLOYEE.EMP_CODE <='ZZ'; 
+0

Điều này hoàn toàn không liên quan gì đến câu hỏi (và đó cũng là SQL không hợp lệ) –

3

Sử dụng bí danh bảng trong tham gia điều kiện:

update addresses a 
set cid = b.id 
from customers b 
where a.id = b.id 
Các vấn đề liên quan