从Oracle移植到Postgres的连接

时间:2010-04-27 21:52:30

标签: sql database oracle postgresql

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正在加入常量。

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

2 个答案:

答案 0 :(得分:1)

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

语句的相等性实际上将与AIRSPACE表中的数据相关联,但老实说阅读语句我不认为(+)修饰符在这种情况下实际上做了一些有用的事情,除了可能会抛弃优化

答案 1 :(得分: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列表仅包含 常数。

  • 之间没有连接条件 AIRSPACE和APSMAIN.MISSION_CLASS

  • MISSION_CLASS由。过滤 'AIRDROP'谓词。如果没有 AIRDROP行,那么就没有行了 插入

  • AIRSPACE表显然是 由TRANSIT ALPHA过滤 谓语。然而与外面 加入,它至少会回来 一行,但可能会返回多个 行。

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