SELECT A.業務CD, B.業務名称 AS VZ業務情報_業務名称,
       A.事業CD, C.事業名称 AS VZ事業情報_事業名称,
       A.実施区分,VZコード.コード名称 実施区分名称, A.実施日,FROM VD実施日 A LEFT JOIN VZ業務情報 B ON A.業務CD = B.業務CD
LEFT JOIN VZ事業情報 C ON C.事業CD = A.事業CD
LEFT JOIN VZコード ON VZコード.コード種別ID = '400001'
          AND VZコード.開始年月日<=?
          AND (VZコード.終了年月日>=? OR VZコード.終了年月日 IS NULL)
          AND VZコード.システムコード = A.実施区分
LEFT JOIN (SELECT VZコード.システムコード,VZコード.コード名称 FROM VZコード WHERE VZコード.コード種別ID = '300051' 
          AND VZコード.開始年月日<=?
          AND (VZコード.終了年月日>=? OR VZコード.終了年月日 IS NULL)) 
          実施場所情報 ON 実施場所情報.システムコード = A.実施場所CD
and A.実施日<='99999999'
and A.実施場所CD=?
ORDER BY A.実施日 desc,A.実施場所CD,A.時間FROM,A.時間TO,A.実施区分,A.業務CD,A.実施種別CD,A.事業CD,A.表示順上面是正确的SQL文,是改正之后的,但是如果第三个left join用下面的形式实行:
LEFT JOIN (SELECT VZコード.システムコード,VZコード.コード名称 FROM VZコード WHERE VZコード.コード種別ID = '400001' AND VZコード.開始年月日<=? AND (VZコード.終了年月日>=? OR VZコード.終了年月日 IS NULL)) 実施区分情報 ON 実施区分情報.システムコード = A.実施区分即把外连接的条件改成子查询,只用【A.実施区分】做为子查询后的检索条件后,检出的结果就是空

解决方案 »

  1.   

    你凭啥说上面的是正确的SQL,其实上面的是错误的SQL,因为在join中,绝对不能使用类似“VZコード.コード種別ID = '400001' ”的条件筛选,这样的筛选是无效的,join连接只能进行字段关联。
      

  2.   

    left join 后:为空,很正常嘛! -- 表的字段值都可以为空,何况是left join呢!
      

  3.   

    当然试过了,left join无视条件筛选的,join可以附带条件,但是楼主写的都是left join,你要是有数据库在手边自己测试吧,SQLSERVER和Oracle下面都是这样的,我实际执行的结果,100%准确。
      

  4.   

    首先表示抱歉,发帖时考虑到有人不识日文,但是怕自己模拟的SQL会产生误差,导致耽误时间白费精力
      

  5.   

    引用 3 楼 qldsrx 的回复:你凭啥说上面的是正确的SQL,其实上面的是错误的SQL,因为在join中,绝对不能使用类似“VZコード.コード種別ID = '400001' ”的条件筛选,这样的筛选是无效的,join连接只能进行字段关联。这位叫做qldsrx。的老兄,你的名字实在是又叼又销魂,我实在是看不出来什么意思啊
    丢你板砖没有别的意思,我不太会用这论坛,不会专门对你的留言回复,所以想引起你注意,才丢的(因为你的观点是错的,实在没办法说是对我有用)实际是这样,这两个SQL语句放在SQLPLUS中跑都是正确的,唯独我说错误的那个,通过JAVA的OJDBC调用,在实际环境中出错。另外,leftjoin中用子查询一点问题也没有啊,别的例子我试过,唯独这个SQL有问题,你可以试试。
      

  6.   

    那请你执行这段SQL语句,如果你的结论正确,LEFT JOIN关联后面的1=2条件会将所有可能的记录都无视,最终一行记录都没有。但实际上,它只将B表的数据都置为空,A表数据全部显示,该条件只影响B表数据,对A表无效。如果你就是想要这种效果,我就不多说了。
    SELECT *
    FROM VD実施日 A  
    LEFT JOIN VZ業務情報 B ON A.業務CD = B.業務CD AND 1=2
      

  7.   

    最终原因不明,把原因归结在ORALCE上了,不过还是未查到,即使OJDBC包一模一样,即使BS环境一模一样,
    还是不行,唯一差别是一个是ORACLE10G.2.8 一个是ORALCE10.2.14。导致问题出现,现在已经不用调查了,不过还是希望有人帮忙告诉我为什么,先结贴送分
      

  8.   


    请不要归结在Oracle上面,如果你能够一开始表述清楚问题,我的回答也就可以很直接了(其实你SQL语句都没有贴完整,From前面居然是逗号。其实那个还是查询本身的区别,第一个SQL语句的外连接的筛选是分开来的,我也说过了,那个筛选对于记录的过滤是无效的,仅让所关联的表记录置空。这样你第一次是关联两次,第二次是合并后关联一次,第一次的两次关联置空情况可能有交叉,而第二次是只要有任意一个条件不满足,都为空,所以你会看到的空列较多。但是这种写法本身不推荐,实际应用中用不着,你为什么会写出这样的查询,我表示质疑。