查询减去问题?

时间:2012-01-24 13:48:22

标签: sql oracle

我的查询未返回预期的记录数量 第一部分返回50.000条记录 第二部分(在负数下方)返回30.000 所以结论我的减去应该返回20.000记录。 只有这不会发生更多的记录被删除21.000。

- 编辑 - 计数返回更多预期的行,这些返回的记录将在以后的步骤中删除。

有人建议吗?

-- select count(*) from (
 SELECT        
    loc.ITEM, 
            loc.loc
            FROM ITEM_LOC loc
    WHERE LOC NOT IN(101,104,107,115,116,117)
    and loc.status = 'A' 
    and primary_supp in (select supplier from item_supplier where supp_discontinue_date >= sysdate) 
   --        );
minus
 --; select count(*) from (
 select distinct item, store from (
  SELECT        
            siv.ITEM,
            sto.store 
            FROM DC_CCN190_SID_VTB siv
            JOIN DC_STORE_RANGING str ON siv.dpac = str.dpac
    join store sto on sto.store_name_secondary = cast(str.loc as varchar2(150 byte))
    where sto.store_close_date >= sysdate 
        union
            SELECT 
    pim.ITEM,
            sto.store
            FROM dc_pim_export_vert PIM
            JOIN DC_STORE_RANGING str ON PIM.dpac = str.dpac
    join store sto on sto.store_name_secondary = cast(str.loc as varchar2(150 byte))
    where PIM.artikel_type_lms = 'D1'
    and sto.store_close_date >= sysdate 
    )

----------------------------------------------- --------------------------------------

计数返回50.000

  select count(*) from (
 SELECT        
    loc.ITEM, 
            loc.loc
            FROM ITEM_LOC loc
    WHERE LOC NOT IN(101,104,107,115,116,117)
    and loc.status = 'A' 
    and primary_supp in (select supplier from item_supplier where supp_discontinue_date >= sysdate));

计数返回30.000

select count(*) from (
 select distinct item, store from (
  SELECT        
            siv.ITEM,
            sto.store 
            FROM DC_CCN190_SID_VTB siv
            JOIN DC_STORE_RANGING str ON siv.dpac = str.dpac
    join store sto on sto.store_name_secondary = cast(str.loc as varchar2(150 byte))
    where sto.store_close_date >= sysdate 
        union
            SELECT 
    pim.ITEM,
            sto.store
            FROM dc_pim_export_vert PIM
            JOIN DC_STORE_RANGING str ON PIM.dpac = str.dpac
    join store sto on sto.store_name_secondary = cast(str.loc as varchar2(150 byte))
    where PIM.artikel_type_lms = 'D1'
    and sto.store_close_date >= sysdate 
    );

所以减号应该返回20.000吧?

2 个答案:

答案 0 :(得分:5)

A = 50000. B = 30000. A - B = 21000.什么是B-A?我期待1000.也就是说,B中有1000条未包含在A中的记录。在一个简单的例子中,

A返回4条记录 吉姆 短发 玛丽 萨曼莎

B返回3条记录 短发 玛丽 约瑟芬

A - B返回2条记录: 吉姆 萨曼莎

B - A返回1条记录: 约瑟芬

答案 1 :(得分:0)

使用

select count(*)
两个查询中的

并将结果与​​

进行比较
select distinct count(*)

应该有区别!


HERE,&#34;此外,如果table_A中有两个相同的行,并且table_B中存在相同的行,则table_A中的两行将从结果集中删除。&#34; < / p>



如果没有区别,那么只有一个解释:

  

MINUS是一个SQL集合操作,用于从第一个元素中选择元素   表然后删除第二个也返回的行   SELECT语句。

并非所有第二秒的行都出现在第一行中。