2015-02-10 68 views
2

我想用通過select語句獲取的值更新列的值。但是,通過執行選擇我有一整套的結果,我想他們中的每一個由czi_first_name_en(一種foreach循環的)來代替 這是什麼,是迄今爲止:如何通過選擇的結果更新列的每一行?

UPDATE citizen_info t 
SET t.czi_first_name_en= 
     (
        SELECT  per_username 
        FROM  person 
        INNER JOIN enrollment_office 
        ON   person.per_id=enrollment_office.eof_manager_id 
        INNER JOIN card_request 
        ON   enrollment_office.eof_id=card_request.crq_enroll_office_id 
        INNER JOIN citizen 
        ON   card_request.crq_citizen_id=citizen.ctz_id 
        INNER JOIN citizen_info 
        ON   citizen.ctz_id=citizen_info.czi_id 
        WHERE  person.per_dep_id=card_request.crq_enroll_office_id) AS person_username 

我該如何繼續?

回答

0

你也可以使用MERGE語句只有一個UPDATE子句 -

MERGE INTO citizen_info t 
USING (SELECT person.per_username per_username, 
       citizen.ctz_id  ctz_id 
     FROM person 
       inner join enrollment_office 
         ON person.per_id = enrollment_office.eof_manager_id 
       inner join card_request 
         ON enrollment_office.eof_id = 
         card_request.crq_enroll_office_id 
       inner join citizen 
         ON card_request.crq_citizen_id = citizen.ctz_id 
     WHERE person.per_dep_id = card_request.crq_enroll_office_id) s 
ON(s.ctz_id = t.czi_id) 
WHEN matched THEN 
    UPDATE SET t.czi_first_name_en = s.per_username 

/
+0

謝謝:)你的建議爲我合併工作,我只是在SELECT後添加了DISTINCT關鍵字 – 2015-02-15 06:37:34

0

1)你只需要一個更新與JOIN,我認爲(Oracle風格)。

UPDATE 
(

select 

per_username as NEW, 
czi_first_name_en as OLD 
from person 
inner join enrollment_office on person.per_id=enrollment_office.eof_manager_id 
inner join card_request on enrollment_office.eof_id=card_request.crq_enroll_office_id 
inner join citizen on card_request.crq_citizen_id=citizen.ctz_id 
inner join citizen_info on citizen.ctz_id=citizen_info.czi_id 
where person.per_dep_id=card_request.crq_enroll_office_id 
) t 

SET t.OLD = t.NEW 

參見:

Update statement with inner join on Oracle

2)您也可以做你的方式,我想。

UPDATE citizen_info t 
SET t.czi_first_name_en= 
(
SELECT 
per_username 
FROM person 
inner join enrollment_office ON person.per_id=enrollment_office.eof_manager_id 
inner join card_request ON enrollment_office.eof_id=card_request.crq_enroll_office_id 
inner join citizen ON card_request.crq_citizen_id=citizen.ctz_id 
inner join citizen_info x ON citizen.ctz_id=x.czi_id 
WHERE person.per_dep_id=card_request.crq_enroll_office_id and x.czi_id=t.czi_id 
) as person_username 

注意唯一區別在這裏:x.czi_id=t.czi_id。 這會將x record鏈接到您要更新的t record

0

你必須與子選擇行「連接」更新行,可能使用一些ID,看到我在子選擇結束嘗試:

update Citizen_Info t 
     set t.czi_first_name_en = 
     (select per_username 
      from person inner join enrollment_office 
       on person.per_id = enrollment_office.eof_manager_id 
      inner join card_request on 
       enrollment_office.eof_id = card_request.crq_enroll_office_id 
      inner join citizen on card_request.crq_citizen_id = citizen.ctz_id 
      inner join citizen_info on citizen.ctz_id = citizen_info.czi_id 
      where person.per_dep_id = card_request.crq_enroll_office_id 
      **and t.perid = person.per_id**) 
相關問題