1

次の表があるとします。非アクティブな行(Active = 0)のみを返したいが、同じFileNameを持つフィールドは無視したい場合。たとえば、クエリは非アクティブであり、同じ別の行に他のファイル名がないため、Helper0990329のみを返す必要があります。VinnyVincenzo1345090457296は結果に含まれるべきではありません。

PATH          |         FileName         |   Active                       
C:\Vinny\     VinnyVincenzo1345090457296.mp3    0
C:\Vinny\     VinnyVincenzo1345090457296.mp3    1
C:\Vinny\     VinnyVincenzo1345137702505.mp3    1
C:\Helper\    Helper0990329.mp3                 0

私は次のことを試みましたが、私が持っているはずのファイルを非アクティブ化(そして後で削除)することになりました:

SELECT 

      [Path],
      [FileName]

  FROM [Flows].[dbo].[Flows_Flows]
  Where [Active] = '0' AND [Created] > '8/18/2012'
  Group By Path, FileName
  Having count(FileName) = 1
  GO
4

4 に答える 4

0

SQL 2005以降を使用していると仮定すると、ランキング関数を使用してこれを解決できます。

select *
from (SELECT [Path], [FileName],
             count(*) over (partition by path, filename) as numFiles
      FROM [Flows].[dbo].[Flows_Flows]
      Where [Created] > '8/18/2012'
     ) t
where active = 0 and numfiles = 1

クエリの問題は、WHERE句がHAVING句の前に評価されたことです。したがって、アクティブな行は表示されませんでした。

または、単純なグループでこれを行うことができますが、より複雑なHAVING句を使用します。

SELECT [Path], [FileName]
FROM [Flows].[dbo].[Flows_Flows]
Where [Created] > '8/18/2012'
Group By Path, FileName
Having count(FileName) = 1 and
       sum(case when Active = '0' then 1 else 0 end) = 1
于 2012-08-21T02:34:49.053 に答える
0

内部のインスタンスの数を数えて試してみてくださいSubQuery

SELECT  [Path], [FileName]
FROM    Flows_Flows a 
            INNER JOIN 
            (
                SELECT  [FileName],
                        COUNT([FileName]) TotalCount
                FROM    Flows_Flows
                GROUP BY [FileName]
            ) b ON a.[FileName] = b.[FileName]
WHERE   a.[Active] = 0 AND
        a.[Created] > '8/18/2012' AND
        b.TotalCount = 1
于 2012-08-21T02:34:55.067 に答える
0

idフィールドもあると思いますよね?また、必ずしも重複していないものだけではなく、アクティブなエントリを持たないユーザーが必要だと思います。

INWHERE句で使用できます。

例:

SELECT Path, FileName FROM Flows_Flows WHERE Active = 0 AND id NOT IN
( SELECT id FROM Flows_Flows WHERE Active = 1 )
于 2012-08-21T02:39:22.310 に答える
0

を使用してLEFT OUTER JOIN、結合で重複する行が見つかった場合は、それを除外します(dup.path is null)。

SELECT 
      f.[Path],
      f.[FileName]
FROM [Flows].[dbo].[Flows_Flows] f
LEFT OUTER JOIN [Flows].[dbo].[Flows_Flows] dup on f.Path = dup.Path and dup.Active = '1' --Active must be set otherwise, we found ourselves
Where f.[Active] = '0' AND f.[Created] > '8/18/2012'
  AND dup.Path is null -- here we exculde all rows that have a duplicate

このソリューションにはサブクエリも集計もないという利点があります。そうは言っても、クエリプランを見ていないと、本当に速いかどうかはわかりません。(私もこの構文を好むと思います。)

于 2012-08-21T02:58:48.473 に答える