如上示例,目的是想查询状态为‘y’的数据,但是如果有小类‘0’的数据状态为‘y’的,那么对应 相同时间 相同大类 的所有数据状态都是‘y’,数据量比较大,考虑性能,如何做sql
多谢了sql

解决方案 »

  1.   

    select *
    from 表 a
    where 状态='y' or 
    exists(select 1 from 表 b where b.状态='y' and b.小类=0 and a.时间=b.时间 and a.大类=b.大类)
      

  2.   

    SELECT 时间,大类,小类,名称,CASE WHEN 小类=0 THEN 'y' ELSE 状态 END 状态
    FROM TB
    WHERE 大类 IN (
    SELECT 大类
    FROM TB
    WHERE 状态='y')--状态列加上索引
      

  3.   

    不好意思,我再好好表达一下,简单的说,就是根据状态查询数据,状态可能会是多个(上面的图示只查询一个状态y), 复杂的地方是要求 如果有数据:小类是‘0’,状态是‘y’,那么对应这条数据的相同时间、相同大类下的所有数据,不管状态是什么,都当做 状态是‘y’来处理
      

  4.   

    比如上面有<状态>是'y'数据:  2013-8-26 乙 0 **** y ,那么对应于这条数据的 相同时间、相同大类的数据为:2013-8-26 乙 2 **** a  和 
    2013-8-26 乙 3 **** c   , 那么这两条数据的<状态>就要全部当做‘y’来处理,查询条件里要是有y,那么它们一起要显示(并且状态也要设置为y),如果查询条件里是a或b,它们应该不显示出来(因为已经把这两条数据的状态当做y来处理了)
      

  5.   


    select *
    from tb a
    where 状态='y' or 
    exists(select 1 
    from (select * from tb  where 小类='0' and 状态='y')b 
    where a.时间=b.时间 and a.大类=b.大类
    )
      

  6.   


    select * from t where t.[小类] != 0 and [状态]='y'
    union
    select t.[时间],t.[大类],t.[小类],t.[名称],'y' as [状态] from
    (
    select * from t 
    where t.[小类] = 0
    ) t1 inner join t 
    on t1.[时间]=t.[时间] and t1.[大类] = t.[大类]
      

  7.   

    sorry,好像不是我想要的结果,不能把状态强制设置为y,假如条件是查询状态是'a'或'y'的,那是不是就不可以了