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

如果要执行快速而脏的检查,可以尝试UNIQUELocator. 如果成功,则没有重复项。如果它失败了,你有。

上述问题是 SQL-ServerNULL以相当非标准的方式处理值,即使您有 2 行NULL且没有其他真正的重复值,约束/索引创建也会失败。为避免这种情况(并且如果您希望允许多个 Null 但不允许重复的非空值),您可以使用过滤的唯一索引进行检查:

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

要查找重复项(并同时检查),一种方法是:

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

选择 Locator,count(*) 作为 dbo.Problem group by Locator 的出现

--使用 where 子句,您可以过滤重复的定位器,例如

其中出现>1

于 2013-10-12T20:05:17.497 回答
0

如果您有大量数据,则可以尝试以下解决方案:

DECLARE @MyTable TABLE
(
    [ProblemId] [int] IDENTITY(1,1) NOT NULL,
    [SubTopicId] [int] NOT NULL,
    [Locator] [nvarchar](50) NULL
);

INSERT  @MyTable (SubTopicId, Locator)
SELECT  11, 'A' UNION ALL
SELECT  11, 'B' UNION ALL
SELECT  22, 'C' UNION ALL
SELECT  44, 'C' UNION ALL
SELECT  33, 'D' UNION ALL
SELECT  55, 'D'  UNION ALL
SELECT  22, 'D'  UNION ALL
SELECT  22, NULL;

SET STATISTICS IO ON;

SELECT  *
FROM
(
    SELECT  x.*,
            ROW_NUMBER() OVER(PARTITION BY x.Locator ORDER BY x.ProblemId ASC) AS RowNumAsc,
            ROW_NUMBER() OVER(PARTITION BY x.Locator ORDER BY x.ProblemId DESC) AS RowNumDesc
    FROM    @MyTable x
) src
WHERE   NOT(src.RowNumAsc = 1 AND src.RowNumDesc = 1);
于 2013-10-12T20:31:05.940 回答