SELECT t.*
  FROM alx_material_types_intf_v t
 WHERE t.material_level = 3
   AND t.material_type NOT IN
       (SELECT a.parent_type FROM alx_material_types_intf_v a);--无数据
SELECT t.*
  FROM alx_material_types_intf_v t
 WHERE t.material_level = 3
   AND t.material_type NOT IN (SELECT a.parent_type
          FROM alx_material_types_intf_v a
         WHERE a.parent_type = t.material_type); --有数据求解为什么?先感谢各位了

解决方案 »

  1.   

    怎么我测试没数据
    WITH t1 AS
    (select 1 ID  from dual UNION 
    select 2 ID from dual UNION 
    select 3 ID from dual),
    t2 AS 
    (select 1 cd  from dual UNION 
    select 2 cd from dual UNION 
    select 3 cd from dual)
    --select * from t1 WHERE ID NOT IN (select cd from t2)
    select * FROM t1 WHERE ID NOT IN (select t2.cd from t2 WHERE t2.cd=t1.id)
      

  2.   

    因为alx_material_types_intf_v的parent_type列里有空值,所以子查询的结果集里有 null 存在not in (null) 的结果是null,不是true
      

  3.   

    2楼说的不错,你的第一句SQL的子查询SELECT a.parent_type FROM alx_material_types_intf_v a 中parent_type有空值的话,not in (null)。所以没有数据、
    而你的第二个SQL坐等大神解释(个人觉得是不是优化器解决这个问题了)...
      

  4.   

    2楼说的不错,你的第一句SQL的子查询SELECT a.parent_type FROM alx_material_types_intf_v a 中parent_type有空值的话,not in (null)。所以没有数据、
    而你的第二个SQL坐等大神解释(个人觉得是不是优化器解决这个问题了)...
    第二个SQL里面,因为多了个 “= ”的条件,导致无论如何结果集内不会出现空值。。
      

  5.   

    2楼说的不错,你的第一句SQL的子查询SELECT a.parent_type FROM alx_material_types_intf_v a 中parent_type有空值的话,not in (null)。所以没有数据、
    而你的第二个SQL坐等大神解释(个人觉得是不是优化器解决这个问题了)...
    第二个SQL里面,因为多了个 “= ”的条件,导致无论如何结果集内不会出现空值。。
    额,这点给忘了、谢谢解疑!