数据库迁移SQL报错:别名t未定义前使用的解决方法问询
解决INSERT语句中"unable to convert .t"报错问题
问题原因
报错根源在于INSERT语句的目标列列表中错误使用了SELECT子句里才定义的表别名t。目标列属于要插入的表t$trades_long,不需要引用后续FROM子句中定义的表别名,数据库无法识别在定义前使用的别名t。
改写方案
只需移除INSERT目标列中的t.前缀,同时为SELECT子句中字段来源不明确的trd_trader加上t.别名,确保语义清晰:
INSERT INTO t$trades_long (portfolio_name, fund, cusip, td_num, desc_instmt, trd_price, trd_trade_dt, trd_settle_dt, trd_counterparty, trd_td_par, tran_type, sec_type, trd_type, trd_trader) SELECT p.portfolio_name, t.fund, t.cusip, t.td_num, a.desc_instmt, t.trd_price, t.trd_trade_dt, t.trd_settle_dt, t.trd_counterparty, t.trd_td_par, t.tran_type, a.sec_type, 'long' AS trd_type, t.trd_trader FROM pfi_pilot.br_transaction AS t, pfi_pilot.br_portfolio_group AS p, pfi_pilot.br_asset AS a WHERE t.fund = p.fund AND p.portfolio_group = 'ALL_FUNDS' AND t.cusip = a.cusip AND t.tran_type IN ('BUY', 'SELL', 'ISSUE', 'ALLOC') AND t.trd_status <> 'C' AND a.sm_sec_group NOT IN ('CASH', 'FUTURE', 'FX', 'FUND', 'SWAP', 'OPTION') AND a.sec_type != 'MBS_TBA' AND t.trd_counterparty NOT IN ('IFUND', 'GHOST', 'SPO', 'SPOBO', 'CONV', 'ASSGN') AND t.trd_trade_dt >= par_from_dt AND t.trd_trade_dt <= par_to_dt AND t.cusip NOT IN (SELECT DISTINCT cusip FROM pfi_pilot.br_asset WHERE (COALESCE(risk_country, country) = 'US' AND sm_sec_type IN ('GOVT', 'TBILL'))) AND t.trd_td_par > 0;
修改点说明
- 移除目标列的
t.前缀:INSERT的目标列属于表t$trades_long,直接写列名即可,不需要引用SELECT子句中br_transaction的别名t - 明确SELECT字段来源:为
trd_trader加上t.,避免数据库因字段名冲突或来源不明确产生歧义
内容的提问来源于stack exchange,提问作者jack gell
相关产品推荐
相关产品推荐

