Oracle8i 数据库,SQL语句如下:SELECT distinct L.FLT_NR "航班号",
                S.SCH_DEP_DT + 1 / 3 "起飞时间(北京时)",
                S.DEP_ARP_CD "起飞站",
                S.ARV_ARP_CD "落地站",
                S.LATEST_TAIL_NR "机尾号",
                C.FCAP "外籍机组"
  FROM (SELECT '3067' FLT_NR
          FROM DUAL
        UNION
        SELECT '0321'
          FROM DUAL
        UNION
        SELECT '0325'
          FROM DUAL
        UNION
        SELECT '0327'
          FROM DUAL
        UNION
        SELECT '0345'
          FROM DUAL
        UNION
        SELECT '0455'
          FROM DUAL
        UNION
        SELECT '0467'
          FROM DUAL
        UNION
        SELECT '0383'
          FROM DUAL
        UNION
        SELECT '0359'
          FROM DUAL
        UNION
        SELECT '0301'
          FROM DUAL
        UNION
        SELECT '0302' FROM DUAL) L,
       (SELECT *
          FROM SCH_DOPS_SOFL S
         WHERE S.SCH_DEP_DT BETWEEN SYSDATE - 1 / 3 AND
               TRUNC(SYSDATE) - 1 / 3 + 1 + 11 / 24) S,
       (select s.flt_dt, a.flt_nr, s.flt_nr as back_flt_nr, s.latest_tail_nr
          from Sch_dops_sofl s,
               (select s.flt_nr,
                       s.latest_tail_nr,
                       s.sch_dep_dt,
                       s.sch_arv_dt,
                       s.dep_arp_cd,
                       s.arv_arp_cd
                  from Sch_dops_sofl s,
                       (SELECT '3067' FLT_NR
                          FROM DUAL
                        UNION
                        SELECT '0321'
                          FROM DUAL
                        UNION
                        SELECT '0325'
                          FROM DUAL
                        UNION
                        SELECT '0327'
                          FROM DUAL
                        UNION
                        SELECT '0345'
                          FROM DUAL
                        UNION
                        SELECT '0455'
                          FROM DUAL
                        UNION
                        SELECT '0467'
                          FROM DUAL
                        UNION
                        SELECT '0383'
                          FROM DUAL
                        UNION
                        SELECT '0359'
                          FROM DUAL
                        UNION
                        SELECT '0301'
                          FROM DUAL
                        UNION
                        SELECT '0302' FROM DUAL) M
                 where M.FLT_NR = s.flt_nr(+)
                   and s.flt_dt BETWEEN SYSDATE - 1 / 3 AND
                       TRUNC(SYSDATE) - 1 / 3 + 1 + 11 / 24) a
         where s.latest_tail_nr = a.latest_tail_nr
           and s.dep_arp_cd = a.arv_arp_cd
           and s.sch_dep_dt between a.sch_arv_dt and a.sch_arv_dt + 12 / 24) F,
       (SELECT DISTINCT S.Flt_Nr, S.LATEST_TAIL_NR, 'Y' AS FCAP
          FROM ROSTER_V R, DUTY_PRD_SEG_V D, SCH_DOPS_SOFL S, CREW_V C
         WHERE R.SERIES_NUM = D.SERIES_NUM
           AND R.SCHED_NM = D.SCHED_NM
           AND R.STAFF_NUM = C.STAFF_NUM
           AND S.CREW_DEP_DT = D.RESCHEDULED_FLT_DT_TM - 1 / 3
           AND TRIM(S.FLT_NR || S.OP_SUFFIX) = D.FLT_NUM
           AND S.LATEST_DEP_ARP_CD = D.ACT_PORT_A
           AND S.LATEST_ARV_ARP_CD = D.ACT_PORT_B
           AND D.RESCHEDULED_FLT_DT_TM BETWEEN SYSDATE AND
               TRUNC(SYSDATE) + 1 + 11 / 24
           AND D.DELETE_IND = 'N'
           AND D.DUTY_CD = 'FLY'
           AND D.FD_IND = 'Y'
           AND C.NATIONALITY_CD <> 'CN') C
 WHERE L.FLT_NR = S.FLT_NR(+)
   AND L.FLT_NR = F.flt_nr(+)
   AND (L.FLT_NR = C.FLT_NR(+) or F.back_flt_nr = C.FLT_NR)问题出在最后一个ADN条件中,PL/SQL Developer 中报:outer join operator (+) not allowed in operand of OR or IN.
试过改用 left join 连接,发现Oracle8i不支持 left join 
PS: L.FLT_NR 为用户关注的航班, S.FLT_NR 为近期的所有航班, F.back_flt_nr 为用户关注的航班对应的返程航班,C.FLT_NR为近期有外籍机组的航班。
所需要的结果为:用户关注的航班或者对应的返程航班是否有外籍机组 

解决方案 »

  1.   

    那你就分开写,写两个union 字句select * from 
    ..
    where 
     L.FLT_NR = S.FLT_NR(+)   
     AND L.FLT_NR = F.flt_nr(+)    
     AND L.FLT_NR = C.FLT_NR(+) union allselect * from 
    ..
    where 
     L.FLT_NR = S.FLT_NR(+)   
     AND L.FLT_NR = F.flt_nr(+)    
     AND F.back_flt_nr = C.FLT_NR)  
      

  2.   

    感谢你的回答
    只能用union了吗?这样写的话SQL语句太长了。
      

  3.   

    8i啊太古老了。我用10G,从来不用那个+号,一直用left outer join
      

  4.   

    8i啊太古老了。我用10G,从来不用那个+号,一直用left outer join
      

  5.   

    闲太长的话。。那你就用动态SQL啊,用if else 或者case when 判断