2010-04-27 83 views
1
INSERT INTO MISSION_OBJECTIVE(MSN_INT_ID, MO_INT_ID, MO_MSN_CLASS_NM, 
MO_MSN_CLASS_CD, MO_MSN_TYPE, MO_PRIORITY, MO_COMMENT, MO_START_DT, 
MO_END_DT, ASP_AIRSPACE_NM, MO_OBJ_LOCATION, MO_ALO_LEG_ID, 
MO_ALO_ARRIVE_LOC) SELECT '1025', '1', 'AIRDROP', 'ADP', 'LAPES', NULL, 
COALESCE(NULL, ' '), TO_TIMESTAMP('1002260900', 'YYMMDDHH24MI'), 
TO_TIMESTAMP('1002260915', 'YYMMDDHH24MI'), 'TRANSIT ALPHA', 'TRANSIT ALPHA', '1', 'TRANSIT ALPHA' 
FROM AIRSPACE ASP, apsmain .MISSION_CLASS MC WHERE ASP.ASP_AIRSPACE_NM(+)= 'TRANSIT ALPHA' 
AND MC.MCS_MISSION_CLASS_NAME= 'AIRDROP' AND 'TRANSIT ALPHA' 
IS NOT NULL 

令我困惑的部分是ASP.ASP_AIRSPACE_NM正在被加入到一个常量中。从Oracle到Postgres的移植连接

我该如何移植它以使用正常的右连接?

回答

1

整理格式化了一下。

INSERT 
INTO MISSION_OBJECTIVE 
    (
    MSN_INT_ID, MO_INT_ID, MO_MSN_CLASS_NM, MO_MSN_CLASS_CD, 
    MO_MSN_TYPE, MO_PRIORITY, MO_COMMENT, MO_START_DT, 
    MO_END_DT, ASP_AIRSPACE_NM, MO_OBJ_LOCATION, MO_ALO_LEG_ID, 
    MO_ALO_ARRIVE_LOC 
) 
SELECT '1025', '1', 'AIRDROP', 'ADP', 
    'LAPES', NULL, COALESCE(NULL, ' '), TO_TIMESTAMP('1002260900', 'YYMMDDHH24MI'), 
    TO_TIMESTAMP('1002260915', 'YYMMDDHH24MI'), 'TRANSIT ALPHA', 'TRANSIT ALPHA', '1', 
    'TRANSIT ALPHA' 
FROM AIRSPACE ASP, apsmain .MISSION_CLASS MC 
WHERE ASP.ASP_AIRSPACE_NM(+) = 'TRANSIT ALPHA' 
AND MC.MCS_MISSION_CLASS_NAME= 'AIRDROP' 

观察:

  • SELECT列表只包含 常数。

  • 没有 空域和APSMAIN.MISSION_CLASS

  • 的MISSION_CLASS由 “空投”谓词过滤之间的连接条件。如果没有 AIRDROP行,则不会插入 行。

  • 空域表是显然 由TRANSIT ALPHA 谓词过滤。但与外部的 联接时,它总是会返回至少 一行,但可能会返回多个 行。

它将插入一行的每个行空投如果存在零个或一个TRANSIT ALPHA行 如果有多个TRANSIT ALPHA行,插入的行数将被multipleid。例如,三个AIRDROP行和两个TRANSIT ALPHA行将导致插入六行。

1

它不完全相同 - (+)指定了Oracle的外部连接。

这些语句的等同性实际上将与AIRSPACE表中的数据绑定在一起,尽管诚实地阅读了声明,我并不认为(+)修饰符在这种情况下实际上可以做任何有用的事情,优化器。