SELECT 
      FI.SVCID, 
      FI.GROUPNO, 
      FI.ENQUETE_NO, 
      QL.QUESTION_NO, 
      QL.QUESTION, 
      QL.QTYPE, 
      CL.CHOICENO, 
      CL.CHOICETXT, 
      FI.STARTDT, 
      FI.ENDDT 
    FROM 
      INFO FI 
      LEFT OUTER JOIN QUESTION_LIST QL 
        ON FI.ENQUETE_NO = QL.ENQUETE_NO 
      LEFT OUTER JOIN CHOICE_LIST CL 
        ON FI.ENQUETE_NO = CL.ENQUETE_NO 
        AND QL.QUESTION_NO = CL.QUESTION_NO 
    WHERE 
      FI.SVCID = 'XXX' 
    AND 
      FI.GROUPNO = 53 
    AND 
      FI.STARTDT < SYSDATE 
    AND 
      FI.ENDDT > SYSDATE       把left join的写法换成+的写法,如何弄?

解决方案 »

  1.   


    FROM INFO FI ,
    QUESTION_LIST QL ,
    CHOICE_LIST CL 
    WHERE FI.ENQUETE_NO = QL.ENQUETE_NO(+)
      AND FI.ENQUETE_NO = CL.ENQUETE_NO(+)
      ...
      

  2.   

    参考代码:SELECT 
          FI.SVCID, FI.GROUPNO, FI.ENQUETE_NO, QL.QUESTION_NO, 
          QL.QUESTION, QL.QTYPE, CL.CHOICENO, CL.CHOICETXT, 
          FI.STARTDT, FI.ENDDT 
    FROM  INFO FI, QUESTION_LIST QL, CHOICE_LIST CL      
    WHERE FI.ENQUETE_NO = QL.QL.ENQUETE_NO(+)
          AND FI.ENQUETE_NO = CL.ENQUETE_NO(+)
          AND FI.SVCID = 'XXX'
          AND FI.GROUPNO = 53
          AND FI.STARTDT < SYSDATE
          AND FI.ENDDT > SYSDATE;
    关于外连接的归纳如下:
    在使用老的SQL标准的外连接查询语句时,(+)放在=的左边或右边分别对应叫做右外连接和左外连接;进行左外连接时,左面的表的数据全部显示出来;(+)放在哪个表的后面,就会将另一表中所有记录显示出来。
      

  3.   

    SELECT 
          FI.SVCID, 
          FI.GROUPNO, 
          FI.ENQUETE_NO, 
          QL.QUESTION_NO, 
          QL.QUESTION, 
          QL.QTYPE, 
          CL.CHOICENO, 
          CL.CHOICETXT, 
          FI.STARTDT, 
          FI.ENDDT 
        FROM 
          INFO FI 
          ,QUESTION_LIST QL 
          ,CHOICE_LIST CL 
        WHERE 
            FI.ENQUETE_NO = QL.ENQUETE_NO(+) 
            AND
            FI.ENQUETE_NO = CL.ENQUETE_NO(+) 
            AND
            QL.QUESTION_NO = CL.QUESTION_NO(+)
            AND 
            FI.SVCID = 'XXX' 
            AND 
            FI.GROUPNO = 53 
            AND 
            FI.STARTDT < SYSDATE 
            AND 
            FI.ENDDT > SYSDATE  
      

  4.   

    你这少了第三个条件:QL.QUESTIONNO = CL.QUESTIONNO
      

  5.   

    实际上我一开始就是这么写的,但报错:ORA-01417: a table may be outer joined to at most one other table,关键是三个表,交互关联,FI先把QL和CL左连接进来,通过ENQUETENO,然QL又和CL通过QUESTIONNO关联,我不知道这叫啥关联
      

  6.   


    --说明表的链接顺序有问题        FI.ENQUETE_NO (+) = QL.ENQUETE_NO        
            AND
            FI.ENQUETE_NO = CL.ENQUETE_NO(+) 
            AND
            QL.QUESTION_NO = CL.QUESTION_NO(+)
    如果遇到那个,就把这个左链接变成右链接,即可!
      

  7.   

    还是报一样的错,而且这么写,不是把QL当成主表了吗,实际应该FI是主表。
      

  8.   

    SELECT 
          FI.SVCID, 
          FI.GROUPNO, 
          FI.ENQUETE_NO, 
          QL.QUESTION_NO, 
          QL.QUESTION, 
          QL.QTYPE, 
          CL.CHOICENO, 
          CL.CHOICETXT, 
          FI.STARTDT, 
          FI.ENDDT 
        FROM 
          INFO FI 
          ,QUESTION_LIST QL 
          ,CHOICE_LIST CL 
        WHERE 
            FI.ENQUETE_NO = QL.ENQUETE_NO(+) 
            AND
            FI.ENQUETE_NO = CL.ENQUETE_NO(+) 
            AND
            CL.QUESTION_NO = QL.QUESTION_NO(+)
            AND 
            FI.SVCID = 'XXX' 
            AND 
            FI.GROUPNO = 53 
            AND 
            FI.STARTDT < SYSDATE 
            AND 
            FI.ENDDT > SYSDATE  改了一下,你试试!
      

  9.   

    不行啊,还是ORA-01417: a table may be outer joined to at most one other table
      

  10.   

    你QQ号多少,我加你Q,远程连接过去,帮你看一下!
      

  11.   


    SELECT FI.SVCID, FI.GROUPNO, FI.ENQUETE_NO, QL.QUESTION_NO, QL.QUESTION, QL.QTYPE, CL.CHOICENO, CL.CHOICETXT, FI.STARTDT, FI.ENDDT 
    FROM INFO FI , QUESTION_LIST QL ,CHOICE_LIST CL  
    WHERE  FI.ENQUETE_NO *= QL.ENQUETE_NO AND FI.ENQUETE_NO *= CL.ENQUETE_NO AND CL.QUESTION_NO *=QL.QUESTION_NO 
    FI.SVCID = 'XXX' AND FI.GROUPNO = 53 AND FI.STARTDT < SYSDATE AND FI.ENDDT > SYSDATE 
    SELECT FI.SVCID, FI.GROUPNO, FI.ENQUETE_NO, QL.QUESTION_NO, QL.QUESTION, QL.QTYPE, CL.CHOICENO, CL.CHOICETXT, FI.STARTDT, FI.ENDDT 
    FROM INFO FI , QUESTION_LIST QL ,CHOICE_LIST CL  
    WHERE  FI.ENQUETE_NO = QL.ENQUETE_NO(+) AND FI.ENQUETE_NO = CL.ENQUETE_NO(+) AND CL.QUESTION_NO=QL.QUESTION_NO(+) 
    FI.SVCID = 'XXX' AND FI.GROUPNO = 53 AND FI.STARTDT < SYSDATE AND FI.ENDDT > SYSDATE 
      

  12.   


    select FICL.SVCID, FICL.GROUPNO, FICL.ENQUETE_NO, FICL.STARTDT, FICL.ENDDT , FICL.CHOICENO, FICL.CHOICETXT,FICL.QUESTION_NO
    from 
    (
    SELECT FI.SVCID, FI.GROUPNO, FI.ENQUETE_NO, FI.STARTDT, FI.ENDDT , CL.CHOICENO, CL.CHOICETXT,CL.QUESTION_NO
    from INFO FI ,CHOICE_LIST CL  
    where FI.ENQUETE_NO = CL.ENQUETE_NO(+) and FI.SVCID = 'XXX' AND FI.GROUPNO = 53 AND FI.STARTDT < SYSDATE AND FI.ENDDT > SYSDATE ) FICL,
    QUESTION_LIST QL
    where FICL.ENQUETE_NO= QL.ENQUETE_NO(+) and FICL.QUESTION_NO=QL.QUESTION_NO(+) 
      

  13.   


    select FICL.SVCID, FICL.GROUPNO, FICL.ENQUETE_NO, FICL.STARTDT, FICL.ENDDT , FICL.CHOICENO, FICL.CHOICETXT,FICL.QUESTION_NO, QL.QUESTION_NO, QL.QUESTION, QL.QTYPE
    from 
    (
    SELECT FI.SVCID, FI.GROUPNO, FI.ENQUETE_NO, FI.STARTDT, FI.ENDDT , CL.CHOICENO, CL.CHOICETXT,CL.QUESTION_NO
    from INFO FI ,CHOICE_LIST CL  
    where FI.ENQUETE_NO = CL.ENQUETE_NO(+) and FI.SVCID = 'XXX' AND FI.GROUPNO = 53 AND FI.STARTDT < SYSDATE AND FI.ENDDT > SYSDATE ) FICL,
    QUESTION_LIST QL
    where FICL.ENQUETE_NO= QL.ENQUETE_NO(+) and FICL.QUESTION_NO=QL.QUESTION_NO(+) 
      

  14.   

    第一步
    select * from a,b where a.id=b.id(+) 
    OK
    第二步
    select * from a,b,c where a.id=b.id(+) and a.id=c.id(+)
      

  15.   

    解决了,FI表和QL是一对多的关系,QL和CL又是一对多的关系,QL表代表问题,CL代表每个问题的选项,而FI则代表一堆问题。所以根据业务关系,调整了关联字段,没有用子查询解决了。这样做:
       AND  FI.ENQUETENO = QL.ENQUETENO(+) 
        AND  QL.ENQUETENO = CL.ENQUETENO(+) 
        AND  QL.QUESTIONNO = CL.QUESTIONNO让QL做主表来左关联FI和CL,查询结果一样。