2013-03-04 112 views
0

我是第一次與Oracle合作的SQL Server開發人員。而且我在使用SQL Server中可以輕鬆構建的UPDATE語句時遇到問題。加入表的UPDATE語句

說我有一個表T1與列KeyVal1,Keyval2,KeyVal3,NonKeyVal1,... KeyVal1 2和3是一個複合鍵。

我也有T2的外鍵與T1的複合鍵的關係。如果記錄存在於T2中,我想更新T1.NonKeyVal1和T1.NonKeyVal2。

在T-SQL我會寫:

Update T1 
Set NonKeyVal1 = 'x', 
     NonKeyVal2 = 'y' 
FROM T1 
JOIN T2 ON T1.KeyVal1 = T2.KeyVal1 AND 
      T1.KeyVal2 = T2.KeyVal2 AND 
      T1.KeyVal3 = T2.KeyVal3; 

,但我有麻煩的Oracle SQL搞清楚了這一點。任何人都可以幫忙嗎?

+0

你可以寫在sql server中,並做一個鏈接的服務器到oracle – 2013-03-04 20:34:01

回答

1

試試這個

Update T1 
Set NonKeyVal1 = 'x', 
     NonKeyVal2 = 'y' 
FROM T1 WHERE EXISTS (
SELECT 1 FROM T2 WHERE T1.KeyVal1 = T2.KeyVal1 AND 
      T1.KeyVal2 = T2.KeyVal2 AND 
      T1.KeyVal3 = T2.KeyVal3); 
+0

D'oh!我不知道爲什麼我沒有想到這一點。謝謝! – DeadZone 2013-03-04 22:35:35

1

你需要寫爲相關子查詢:

update t1 
set nonkeyval1 = 'x' 
where exists (select null 
       from t2 
       where t1.keyval1 = t2.keyval1 
       and t1.keyval2 = t2.keyval2 
       and t1.keyval3 = t3.keyval3); 
+0

+1「select null」:) – 2013-04-04 13:47:11

1

如果您是基於T2您加入到某些列的值更新T1,那麼在Oracle中,如果通過表上的約束確保連接列是唯一的,則可以編寫可更新視圖。

所以,如果有上keyval1,keyval2唯一或主鍵約束,並keyval3你可以寫......

Update (
    select t1.NonKeyVal1 t1_NonKeyVal1, 
     t1.NonKeyVal2 t1_NonKeyVal2, 
     t2.NonKeyVal1 t2_NonKeyVal1, 
     t2.NonKeyVal2 t2_NonKeyVal2 
    from t1 join t2 on (
      T1.KeyVal1 = T2.KeyVal1 AND 
      T1.KeyVal2 = T2.KeyVal2 AND 
      T1.KeyVal3 = T2.KeyVal3)) 
set t1_NonKeyVal1 = t2_NonKeyVal1, 
    t1_NonKeyVal2 = t2_NonKeyVal1; 

你的情況是一個小更簡單,你可以:

Update (
    select t1.NonKeyVal1, 
     t1.NonKeyVal2 
    from t1 join t2 on (
      T1.KeyVal1 = T2.KeyVal1 AND 
      T1.KeyVal2 = T2.KeyVal2 AND 
      T1.KeyVal3 = T2.KeyVal3)) 
set NonKeyVal1 = 'x', 
    NonKeyVal2 = 'y'; 

如果沒有約束條件,那麼曾經有一種非官方的解決方法,使用無證的優化器提示來繞過更新連接基數檢查,但它不是非常安全。

如今如果沒有約束條件,如果需要引用連接表中的值,可以使用MERGE語句,或者由於您的案例更簡單,其他人建議的相關子查詢就足夠了。