用于排除特定条件的键值匹配记录的SQL查询

时间:2014-05-28 21:08:12

标签: sql tsql

我的表格如下:

declare @temp table(
PkId int,
DetailId int,

Type int
)


insert into @temp(PkId,DetailId,[Type])
select 1,1,5
union
select 2,1,3
union
select 3,1,4
union
select 4,2,5
union
select 5,3,5
union
select 6,3,3

select * from @temp order by DetailId 

给我回报

PkId    DetailId    TypeID

1       1       5

2       1       3

3       1       4

4       2       5

5       3       5

6       3       3

获取记录的条件是

  1. 对于给定的' DetaildID'如果仅存在TypeID 5,则应返回5
  2. 如果存在3或4,则排除5
  3. 我希望输出为

    2   1   3
    
    3   1   4
    
    4   2   5
    
    6   3   3
    

    请帮我查询。

2 个答案:

答案 0 :(得分:0)

我不理解规则的含义,如果不是一些sql难题,但是可以使用SQLServer 2008的窗口函数来编写它们

WITH C AS (
  SELECT pkId, DetailId, typeID
       , _34 = SUM(CASE WHEN TypeID IN (3, 4) THEN 1 ELSE 0 END)
             OVER (PARTITION BY DetailId)
       , _5 =  SUM(TypeID) OVER (PARTITION BY DetailId)
  FROM   Table1
)
SELECT pkId, DetailId, typeID
FROM   C
WHERE  (_34 > 0 AND TypeID <> 5)
   OR  (_5 = 5)

SQLFiddle demo

对于DetaildID组的每一行:

    如果组中有TypeID 3或TypeID 4,
  • _34为正
  • 如果组中唯一TypeID为5 ,则
  • _5将为5

在主查询的WHERE条件中使用这些值来过滤数据。第二个条件(_5 = 5)不检查_34的价值,因为它已经隐含了。
如果TypeID的值不同于3,4或5,则可能存在回退条件,查询原样将在3或4 (_34 > 0 AND TypeID <> 5)的组中返回它们,否则将其删除{ {1}}。

答案 1 :(得分:-1)

select pkid, detailid, type
from temp
where type <> 5
group by pkid, detailid, type
union
select pkid, detailid, type
from temp 
where detailid not in (
select detailid
from temp
where type <> 5
group by pkid, detailid, type

)
order by pkid

TEST