已经搞了2天了,查到的记录,不是多就是少,极其郁闷语句如下,正确的结果是查到的记录数,应该同b_file的纪录数相同各位SQL 高人 帮忙看看,问题出在那里--SQL 2 使用外联结,发现抓取的数据会少,抓取速度也很慢
SELECT COUNT(*)
  FROM ma_file,
       be_file,
       a_file, --主表单头
       b_file, --主表单身
       oac_file, -- 折扣档
       oad_file, -- 折扣档
       oab_file, -- 折扣档
       o_file, -- 订价档
       m_file, -- 订价档
       n_file -- 订价档
 WHERE b01 = a01 -- b_file 关联 a_file
   AND b04 = ma01 -- b_file 关联 ma_file
   AND ma134 = be01(+) -- ma_file 关联 be_file
   AND aconf = 'Y' -- 需要审核
      -- 主表与折扣档关联 ,有可能产生多笔或NULL
   AND a03 = oad01(+) -- a_file 关联 折扣档
   AND oac01 = oad01 -- 折扣档内部关联
   AND oad03 = oab01 -- 折扣档内部关联
   AND oacacti = 'Y' -- 需要审核
      -- 订价,问题出在这里,加上下面这段,就会出现数据缺少
   AND a03 = o01(+) -- a_file 主表关联订价档
   AND b04 = n03(+) -- b_file 主表关联订价档
   AND b05 = n04(+) -- b_file 主表关联订价档,通过3条共同关联
   AND o02 = m01 -- 订价档内部关联
   AND m01 = n01 -- 订价档内部关联
   AND oacti = 'Y' -- 需要审核
   AND macti = 'Y' -- 需要审核
   AND m04 = 1 -- 需要审核
   AND n06 <= to_date('09/01/10', 'yy/mm/dd') -- 限定订价日期在可用的范围内
   AND (n07 IS NULL OR n07 >= to_date('09/01/10', 'yy/mm/dd')) -- 限定订价日期在可用的范围内

解决方案 »

  1.   


    对不起,前面没有说明!现在说明下,表和字段的关系为了避免使用别名,所有的数据库表在设计的时候,表都是用“字母_file”的,字段都是“字母_数字”的方式。
    例如a_file表,它的字段,就是a01,a02,a03,所以不用别名,也不会搞不清楚字段和表的关系。而字段的含义,在单独的一个表中作了解释,一般数字01,表示主键;
      

  2.   

    牛!!!先把主表确定!能形成主表的条件是(符合主键是其他表的父集合)--如果做不到就变成子查询形成一个新的主键序列SELECT COUNT(*)
      FROM ma_file left out join a_file on(主键序列)
      

  3.   

    牛!!!先把主表确定!能形成主表的条件是(符合主键是其他表的父集合)--如果做不到就变成子查询形成一个新的主键序列SELECT COUNT(*)
      FROM ma_file left out join a_file on(主键序列)
      

  4.   

    牛!!!先把主表确定!能形成主表的条件是(符合主键是其他表的父集合)--如果做不到就变成子查询形成一个新的主键序列SELECT COUNT(*)
      FROM ma_file left out join a_file on(主键序列)
      

  5.   

    楼主,建议用 left join, inner join 来实现了。 (+)是以前的写法了。
      

  6.   


    能否举个实例,另外我想在一条SQL里实现a_file, --主表单头,a01是主健
    b_file, --主表单身
    b01 = a01,他们相关联这2个表是主表即SELECT COUNT(*) 
      FROM b_file,a_file 
     WHERE b01 = a01
      

  7.   

    -- 订价,问题出在这里,加上下面这段,就会出现数据缺少
       AND a03 = o01(+) -- a_file 主表关联订价档
       AND b04 = n03(+) -- b_file 主表关联订价档
       AND b05 = n04(+) -- b_file 主表关联订价档,通过3条共同关联
       AND o02 = m01 -- 订价档内部关联
       AND m01 = n01 -- 订价档内部关联
       AND oacti = 'Y' -- 需要审核
       AND macti = 'Y' -- 需要审核
       AND m04 = 1 -- 需要审核
       AND n06 <= to_date('09/01/10', 'yy/mm/dd') -- 限定订价日期在可用的范围内
       AND (n07 IS NULL OR n07 >= to_date('09/01/10', 'yy/mm/dd')) -- 限定订价日期在可用的范围内这一段里面的关系,楼主逐条试过了吗,到底是哪一条出的问题?
    可以把他们一个一个的加到语句里进行排除啊。
      

  8.   

    把WHERE条件中含有 "b_file" 表中的字段
    的等值条件都加了(+)
    例:b01 = a01 -- b_file 关联 a_file 
    改为 : b01(+) = a01 -- b_file 关联 a_file再把不是b_file的字段,但又有(+) 的去掉试试,有可能没改完整SELECT COUNT(*)
      FROM ma_file,
           be_file,
           a_file, --主表单头
           b_file, --主表单身
           oac_file, -- 折扣档
           oad_file, -- 折扣档
           oab_file, -- 折扣档
           o_file, -- 订价档
           m_file, -- 订价档
           n_file -- 订价档
     WHERE b01(+) = a01 -- b_file 关联 a_file
       AND b04(+) = ma01 -- b_file 关联 ma_file
       AND ma134 = be01(+) -- ma_file 关联 be_file
       AND aconf = 'Y' -- 需要审核
          -- 主表与折扣档关联 ,有可能产生多笔或NULL
       AND a03 = oad01 -- a_file 关联 折扣档
       AND oac01 = oad01 -- 折扣档内部关联
       AND oad03 = oab01 -- 折扣档内部关联
       AND oacacti = 'Y' -- 需要审核
          -- 订价,问题出在这里,加上下面这段,就会出现数据缺少
       AND a03 = o01 -- a_file 主表关联订价档
       AND b04(+) = n03 -- b_file 主表关联订价档
       AND b05(+) = n04 -- b_file 主表关联订价档,通过3条共同关联
       AND o02 = m01 -- 订价档内部关联
       AND m01 = n01 -- 订价档内部关联
       AND oacti = 'Y' -- 需要审核
       AND macti = 'Y' -- 需要审核
       AND m04 = 1 -- 需要审核
       AND n06 <= to_date('09/01/10', 'yy/mm/dd') -- 限定订价日期在可用的范围内
       AND (n07 IS NULL OR n07 >= to_date('09/01/10', 'yy/mm/dd')) -- 限定订价日期在可用的范围内
      

  9.   

    佩服.
       说三点:
       1) 集合运算先搞清楚.
       2) +,并非是过时的算法,不过用+有限制,这个限制很关键,如果select a.* from a,b where b.id(+)=a.id and b.col=xx ,那么+会失效.
       3) 可能话,尽量用join关键字.
      

  10.   

    楼主理清一下业务的逻辑关系,再开始整理这个SQL语句可以分步骤一步一步增加新的表,看看数据是否缺少,明确到底在哪个步骤出现了问题
      

  11.   

    能不能把er图贴出来,这个sql的第一感觉是头晕
    大概看了一下,并不是所有表都有关系,建议先分成几个查询,然后建视图或者以这几个查询作为子查询,然后再查询最后结果
    根据条件表间关系如下:
    b_file----- a_file
    b_file----- ma_file
    ma_file---- be_file
    a_file----- oad_file
    oac_file--- oad_file
    oad_file--- oab_file
    a_file----- o_file
    b_file----- n_file
    o_file----- m_file
    m_file----- n_file经过分析,和每个表相关的表:
    ma_file---  b_file  be_file
    be_file---  ma_file
    a_file----- b_file o_file oad_file
    b_file----- a_file ma_file n_file
    oac_file--- oad_file
    oad_file--- oac_file oab_file a_file
    oab_file--- oad_file
    o_file----- a_file m_file
    m_file----- n_file o_file
    n_file----- m_file b_filebe_file只是和ma_file有关系,和别的表没关系,所以(ma_file,be_file)可以作为一个视图或内嵌查询:
    (ma_file,be_file)---  b_file  
    同理:
    a_file----- b_file (m_file,o_file,n_file)(oad_file,oac_file,oab_file)
    b_file----- a_file (ma_file,be_file)(m_file,o_file,n_file)
    (oad_file,oac_file,oab_file)--- a_file
    (m_file,o_file,n_file)----- a_file b_file
    继续简化
    (ma_file,be_file,b_file )v1
    (oad_file,oac_file,oab_file,a_file)v2
    (m_file,o_file,n_file)v3
    然后就这3个查询做查询
    在关系字段上建立索引提高速度
    如果经常使用这个查询就建立视图;要求实时数据就建立普通视图,不要求实时数据就建立物化视图至于你说的查到的记录,不是多就是少应该是业务关系没有理清楚或者对(+)没有理解透彻,你可以先看v1 v2 v3的数据是否正常