Sql Oracle-返回多行的子查询

Sql Oracle-返回多行的子查询,sql,database,oracle,Sql,Database,Oracle,我有以下表格结构: 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\u EXCHANGE\u MAP HS_MARKET Y VARCHAR2(40) TF_EXCHANGE Y VARCHAR2(40) TFV TFE_ID Y NUM

我有以下表格结构:

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\u EXCHANGE\u MAP

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

TFE_ID  Y   NUMBER(22)
TFE_VSE_CODE    Y   VARCHAR2(1000)
不同的TFE\U ID可以有相同的TFE\U VSE\U代码我想这就是我在下面的更新查询中缺少的内容

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\u exc\u code
生成名称<代码>tfv.tfe\U vse\U代码。但我做错了,因为我从这个话题中得到了错误。这就是我尝试过的:

 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);

第一个子查询或第二个子查询中的键必须有多行: 尝试以下方法:

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); 

表定义中的
'Y'
是什么意思?不要使用隐式连接语法(逗号分隔的
FROM
子句)-始终显式声明连接。有可能得到一些样本数据吗?我们还能得到准确的错误代码/信息吗?此外,应该可以将两个子查询合并为一个(至少一般来说是这样,不确定Oracle是否具体)。