已经搞了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')) -- 限定订价日期在可用的范围内
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')) -- 限定订价日期在可用的范围内
对不起,前面没有说明!现在说明下,表和字段的关系为了避免使用别名,所有的数据库表在设计的时候,表都是用“字母_file”的,字段都是“字母_数字”的方式。
例如a_file表,它的字段,就是a01,a02,a03,所以不用别名,也不会搞不清楚字段和表的关系。而字段的含义,在单独的一个表中作了解释,一般数字01,表示主键;
FROM ma_file left out join a_file on(主键序列)
FROM ma_file left out join a_file on(主键序列)
FROM ma_file left out join a_file on(主键序列)
能否举个实例,另外我想在一条SQL里实现a_file, --主表单头,a01是主健
b_file, --主表单身
b01 = a01,他们相关联这2个表是主表即SELECT COUNT(*)
FROM b_file,a_file
WHERE b01 = a01
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')) -- 限定订价日期在可用的范围内这一段里面的关系,楼主逐条试过了吗,到底是哪一条出的问题?
可以把他们一个一个的加到语句里进行排除啊。
的等值条件都加了(+)
例: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')) -- 限定订价日期在可用的范围内
说三点:
1) 集合运算先搞清楚.
2) +,并非是过时的算法,不过用+有限制,这个限制很关键,如果select a.* from a,b where b.id(+)=a.id and b.col=xx ,那么+会失效.
3) 可能话,尽量用join关键字.
大概看了一下,并不是所有表都有关系,建议先分成几个查询,然后建视图或者以这几个查询作为子查询,然后再查询最后结果
根据条件表间关系如下:
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的数据是否正常