返回1记录,如果ID为全部为假

时间:2017-10-12 15:50:11

标签: sql

我正在尝试提出一个查询,该查询返回一个部分列表,其中该部分的所有标志都为false,并且返回的列表应该只返回该部分的一条记录。

Part   Revision   Flag
Part1|   A      | true
Part1|   B      | false
Part2|   C      | false
Part2|   D      | false
Part2|   E      | false
Part3|   A      | true
Part4|   F      | false

输出:

Part               Revision               Flag
Part2|   C(or any other revision)      | false
Part4|   F                             | false

Part1和Part3至少有1个标志设置为true,因此它们不会输出。第2部分和第4部分都没有设置为true的标志,Part2只返回所有部分的1行。

SELECT DISTINCT [PartNum],[RevisionNum],[Flag]
        FROM [Prod].[Erp].[PartRev]
        WHERE RevisionNum is not null AND Approved = 0
ORDER BY PartNum
GROUP BY [PartNum],[RevisionNum],[Flag]

到目前为止,我可以为每个零件编号获得一行,但即使该零件编号的其他零件之一为真,它也只返回一行。

返回的内容:

Part   Revision   Flag
Part1|   B      | false
Part2|   C      | false
Part4|   F      | false

有谁知道如何解决这个问题?

4 个答案:

答案 0 :(得分:1)

首先,选择所有具有flag = true

的记录
SELECT DISTINCT Part FROM PartRev WHERE flag = 1 --or whatever your RDBMS uses for a true value

然后,选择第一个查询中未包含的所有不同记录。所以,查询看起来像这样

SELECT Part, MIN(Revision), flag
FROM PartRev WHERE Part NOT IN (
    SELECT DISTINCT Part FROM PartRev WHERE flag = 1
)
GROUP BY Part, flag

答案 1 :(得分:1)

另一个选择

Select Part 
      ,Revision = max(Revision)
      ,Flag     = max(flag)
 from  YourTable
 Group By Part
 Having max(Flag)='false'

返回

Part    Revision    Flag
Part2   E           false
Part4   F           false

答案 2 :(得分:0)

您可以使用WHERE NOT EXISTS执行此操作,以便不提取任何带有true标记的记录。

看起来您还希望在返回记录时提取该部件的最新版本,这可以通过ROW_NUMBER()完成并选择最近的记录。

;With Cte As
(
    Select  *,
            Row_Number() Over (Partition By Part Order By Revision Desc) As RN
    From    [Prod].[Erp].[PartRev]  P1
    Where   RevisionNum is not null 
    And     Approved = 0
    And Not Exists
    (
        Select  *
        From    [Prod].[Erp].[PartRev]  P2
        Where   P1.Part = P2.Part
        And     P2.Flag = 'true'
    )
)
Select  Part, Revision, Flag
From    Cte
Where   RN = 1

答案 3 :(得分:0)

这样的事情怎么样,作为一个更通用的表述,因为案例陈述可以变得非常复杂:

SELECT 
 SP.Part
 , SP.Revision
 , SP.Flag 
 FROM ( 
     SELECT 
       Part
       , Count(Part) as TC
       , SUM( CASE Flag WHEN 1 THEN 0 ELSE 1 END ) FC
       , MAX(Revision) AS Revision 
       , MAX(flag) AS Flag
     FROM test 
     GROUP BY Part 
     ) SP
 WHERE SP.TC=SP.FC