2013-01-09 47 views
0

我有以下表結構:甲骨文 - 子查詢返回多個行

HSM

HSM_EXC_CODE Y VARCHAR2(60) 
HSM_INSTR_CODE Y VARCHAR2(60) 
HSM_ISIN Y VARCHAR2(60) 
HSM_VWD_TICKERSYMBL Y VARCHAR2(80) 

TENFORE_EXCHANGE_MAP

HS_MARKET Y VARCHAR2(40) 
TF_EXCHANGE Y VARCHAR2(40) 

TFV

TFE_ID Y NUMBER(22) 
TFE_VSE_CODE Y VARCHAR2(1000) 

不同的TFE_ID可以有相同的TFE_VSE_CODE!我想這是我在下面的更新查詢中缺少的。

VSD

VSD_ON Y VARCHAR2(160) 
VSD_ISIN Y VARCHAR2(15) 

中的表連接類似如下:

TENFORE_EXCHANGE_MAP.HS_MARKET = HSM.HSM_EXC_CODE 
TENFORE_EXCHANGE_MAP.TF_EXCHANGE = TFV.TFE_ID 

我試圖填補hsm_isin和hsm_on領域。爲了達到目標,我試圖從hsm.hsm_exc_code生成名稱。 tfv.tfe_vse_code。但我做錯了,因爲我從主題中得到錯誤。這是我曾嘗試:

UPDATE hsm 
     SET hsm_isin    = 
      (SELECT distinct vsd.vsd_isin 
       FROM vsd, tfv, TENFORE_EXCHANGE_MAP 
      WHERE vsd.vsd_on = hsm.hsm_instr_code || '.' || tfv.tfe_vse_code 
        AND hsm.hsm_exc_code = TENFORE_EXCHANGE_MAP.HS_MARKET 
        AND TENFORE_EXCHANGE_MAP.TF_EXCHANGE = tfv.tfe_id) 
      ,hsm.hsm_vwd_tickersymbl = 
      (SELECT distinct vsd.vsd_on 
       FROM vsd, tfv, TENFORE_EXCHANGE_MAP 
      WHERE vsd.vsd_on = hsm.hsm_instr_code || '.' || tfv.tfe_vse_code 
        AND hsm.hsm_exc_code = TENFORE_EXCHANGE_MAP.HS_MARKET 
        AND TENFORE_EXCHANGE_MAP.TF_EXCHANGE = tfv.tfe_id); 
+0

表中的「Y」是什麼意思?不要使用隱式連接語法(逗號分隔的'FROM'子句) - 總是顯式聲明你的連接。有可能獲得一些樣本數據嗎?我們是否也可以得到確切的錯誤代碼/消息?另外,應該可以將兩個子查詢合併爲一個(至少在一般情況下,不確定Oracle是否具體)。 –

回答

0

必須有在第一或第二子查詢鍵多行: 試着這麼做:

SELECT hsm.hsm_instr_code, 
    count(distinct(vsd.vsd_on)) cnt1, 
    count(distinct(vsd.vsd_isin)) cnt2 
FROM vsd, tfv, TENFORE_EXCHANGE_MAP, hsm 
WHERE vsd.vsd_on = hsm.hsm_instr_code || '.' || tfv.tfe_vse_code 
AND hsm.hsm_exc_code = TENFORE_EXCHANGE_MAP.HS_MARKET 
AND TENFORE_EXCHANGE_MAP.TF_EXCHANGE = tfv.tfe_id 
GROUP BY hsm.hsm_instr_code 
HAVING count(distinct(vsd.vsd_on)) > 1 OR count(distinct(vsd.vsd_isin)) > 1 

注:一旦你解決多問題,你可以簡化兩個子查詢之一,如下所示:

UPDATE hsm SET (hsm_isin, hsm.hsm_vwd_tickersymbl) = 
      (SELECT distinct vsd.vsd_isin, vsd.vsd_on 
       FROM vsd, tfv, TENFORE_EXCHANGE_MAP 
      WHERE vsd.vsd_on = hsm.hsm_instr_code || '.' || tfv.tfe_vse_code 
        AND hsm.hsm_exc_code = TENFORE_EXCHANGE_MAP.HS_MARKET 
        AND TENFORE_EXCHANGE_MAP.TF_EXCHANGE = tfv.tfe_id);