1

SQL に非常に慣れていないので、私が抱えている問題について支援をお願いします。

私はソフトウェアを使用して、一部の PC に配置されたファイルを監視します。ファイルが書き込まれるとデータベースにレコードが書き込まれ、削除されると再び記録されます。両方のレコードを持つレコードを削除したいと考えています。この表は次のようになります。

ファイルが作成されるとアクション列に 0 が表示され、削除されると 1 が表示されます

datetime       File hash value                       action
130213 14:33 | FDFGDFGDFGDFDFGVBVNVBNVBNVBNVNVBNVB | 0
130213 14:34 | FDFGDFGDFGDFDFGVBVNVBNVBNVBNVNVBNVB | 1

どんな助けでも大歓迎です。S

4

4 に答える 4

1

結合を使用して、別のアクションを持つレコードがあることを要求できます。

delete  t1
from    Table1 t1
join    Table1 t2
on      t1.[File hash value] = t2.[File hash value]
        and t1.Action <> t2.Action;

削除される行をプレビューするには、次のように置き換えdeleteますselect

select  t1.*
from    Table1 t1
join    Table1 t2
on      t1.[File hash value] = t2.[File hash value]
        and t1.Action <> t2.Action;

SQL Fiddle の例。

于 2013-02-13T10:28:34.477 に答える
0

副選択で削除するファイルを選択できます

delete from files
where file_hashes in (select file_hashes
                      from files
                      group by file_hashes
                      having count(file_hashes) = 2)

SQLFiddle

削除される行を確認するには、副選択を使用できます

select file_hashes
from files
group by file_hashes
having count(file_hashes) = 2
于 2013-02-13T10:42:56.543 に答える
0

SQL Server 2005 以降のバージョンを使用している場合は、次のことを試すことができます。

WITH marked AS (
  SELECT
    CanDelete =
      CASE MIN(Action) OVER (PARTITION BY FileHashValue)
      WHEN MAX(Action) OVER (PARTITION BY FileHashValue)
      THEN 0
      ELSE 1
      END
  FROM atable
)
DELETE FROM marked
WHERE CanDelete = 1
;

markedCTE は、対応する の最小アクションが最大アクションと同じであるかどうかをすべての行でチェックしますFileHashValue。そうでない場合、行は削除対象としてマークされます。

その属性に基づいて、CTE が DELETE ステートメントのターゲットとして使用されるメイン クエリで行が削除されます。

クエリは、 が であり、 または のいずれかのみでActionあると想定しています。の場合は、上記の両方のエントリを に置き換えます。int01bitActionCAST(Action AS int)

于 2013-02-13T16:40:20.880 に答える