2016-09-27 71 views
1

在表中的列值從另一個表我需要更新表t1與來自表t2 NEW_ID列old_id列值,其中old_id被表t2匹配更新在Oracle

T1

old_id name desc 
----------------------- 
1  a  abc 
2  b  def 
3  c  adf 
null d  ghi 

T2

new_id old_id code 
---------------------- 
x  1  ab 
y  2  cd 
z  3  gh 

我的輸出應該像

T1

old_id name desc 
----------------------- 
x  a  abc 
y  b  def 
z  c  adf 
null d  ghi 
+2

呃,我沒有看到表3中匹配的id。 –

+0

如何更新id = 3的行?這是一個錯字嗎?如果是這樣,請編輯該問題,否則請解釋您需要的邏輯 – Aleksej

+0

對不起,這是一個錯字。現在更正。 – Chris

回答

0

嘗試使用

update t1 set t1.old_id=(select min(t2.new_id) from t2 where t2.old_id=t1.old_id) 

update t1 set t1.old_id=(select max(t2.new_id) from t2 where t2.old_id=t1.old_id) 

要查看將使用此查詢

select t1.*, (select max(t2.new_id) from t2 where t2.old_id=t1=old_id) as futureIdvalue from t1  
+0

我收到一個錯誤,提示「第2行出現錯誤: ORA-01427:單行子查詢返回多行」 – Chris

+0

這是因爲您在t2中對同一個old_id有更多的一個值。現在重試...當我們做min(t2.new_id)時,回答被修改爲 – Christian

+0

不會我們更新所有記錄只有一個最小值? – Chris

-1
UPDATE 
T1 
SET 
T1.old_id= T2.new_id 
FROM 
T1, 
T2 
WHERE 
T1.old_id= T2.old_id; 
+0

爲什麼我在此處得到否定的答案? –

+1

可能因爲這既不是有效的標準SQL,也不適用於Oracle。 –

0

上做出的第變化e開頭幾個假設:

  1. 我認爲沒有在T2表中的問題類型和第三紀錄old_id = 3
  2. 因爲你有Desc列,什麼是Oracle我的保留字我將所有列視爲帶引號的標識符。

這是我的代碼(最後更新語句)。

CREATE TABLE T1 
    ("old_id" VARCHAR2(50), 
    "name" VARCHAR2(50), 
    "desc" VARCHAR2(50) 
); 
/
CREATE TABLE T2 
    (
    "new_id" VARCHAR2(50), 
    "old_id" VARCHAR2(50), 
    "code" VARCHAR2(50) 
); 
/

INSERT INTO T1 VALUES('1', 'a', 'abc'); 
INSERT INTO T1 VALUES('2', 'b', 'def'); 
INSERT INTO T1 VALUES('3', 'c', 'adf'); 
INSERT INTO T1 VALUES(NULL, 'd', 'ghi'); 

INSERT INTO T2 VALUES('x', '1', 'ab'); 
INSERT INTO T2 VALUES('y', '2', 'cd'); 
INSERT INTO T2 VALUES('z', '3', 'gh'); 

UPDATE t1 
    SET "old_id" = (SELECT "new_id" 
        FROM t2 
        WHERE t1."old_id" = t2."old_id");