0

SQL Server 2012 データベースに次のテーブルがあります。

CREATE TABLE [dbo].[Problem](
    [ProblemId] [int] IDENTITY(1,1) NOT NULL,
    [SubTopicId] [int] NOT NULL,
    [ReferenceId] [int] NOT NULL,
    [ProblemStatusId] [int] NOT NULL,
    [Locator] [nvarchar](50) NULL
)

ロケーターは一意であるはずですが、ロケーターの値が同じ行が複数ある場合があると思います。これが事実であるかどうか、またそうである場合、どうすれば行を識別できますか?

4

4 に答える 4

2

高速で汚れたチェックを実行したい場合は、 にUNIQUE制約 (またはインデックス) を追加してみてくださいLocator。成功した場合、重複はありません。それが失敗した場合、あなたは持っています。

上記の問題は、SQL-Server がNULLかなり非標準的な方法で値を処理し、2 つの行がNULLあり、他の実際の重複値がない場合でも、制約/インデックスの作成が失敗することです。これを回避するには (複数の Null を許可するが、null 以外の値の重複は許可しない場合)、フィルター処理された一意のインデックスで確認できます。

CREATE UNIQUE INDEX Locator_UQ           -- choose a name for the index
ON Problem (Locator)
WHERE Locator IS NOT NULL ;

重複を見つける (同時にチェックする) ための 1 つの方法は次のとおりです。

SELECT *
FROM
  ( SELECT *,
           Cnt = COUNT(*) OVER (PARTITION BY Locator)
    FROM Problem
  ) AS p
WHERE Cnt > 1 
ORDER BY Locator, ProblemId ;

上記が 0 行を返す場合、 に重複はありませんLocator

于 2013-10-12T20:03:48.757 に答える
2
select * from table where Locator in 
   (
    select Locator from table group by Locator having count(*) > 1
   )
于 2013-10-12T20:05:11.040 に答える
0

dbo.Problem group by Locator から発生として Locator,count(*) を選択します。

-- where 句を使用して、次のように重複したロケータをフィルタリングできます

ここで発生>1

于 2013-10-12T20:05:17.497 に答える