如何编写SQL查询以识别特定字段中的重复值?

时间:2013-03-13 00:31:34

标签: sql sql-server sql-server-2008 tsql

这是我正在使用的表格:

The table

我想仅识别具有不同参数的重复扣除ID的ReviewID。

例如,在上图中,ReviewID 114有两个不同的参数ID,但两个记录都有相同的扣除ID。

就我的目的而言,此记录(ReviewID 114)有错误。对于单个ReviewID,不应该有两个或多个唯一参数ID具有相同的扣减ID。

我想写一个查询来识别这些类型的记录,但我的SQL技能还没有。帮助

谢谢!

更新1:如果有帮助,我正在使用TSQL(SQL Server 2008) 更新2:我正在寻找的输出与上图相同,减去任何与我所描述的标准不符的记录。

干杯!

3 个答案:

答案 0 :(得分:6)

Select ReviewID, deduction_ID from Table
Group By ReviewID, deduction_ID
Having count(ReviewID) > 1

http://www.sqlfiddle.com/#!3/6e113/3有一个例子

答案 1 :(得分:6)

SELECT * FROM table t1 INNER JOIN (
    SELECT review_id, deduction_id FROM table
    GROUP BY review_id, deduction_id
    HAVING COUNT(parameter_id) > 1
) t2 ON t1.review_id = t2.review_id AND t1.deduction_id = t2.deduction_id;

http://www.sqlfiddle.com/#!3/d858f/3

如果可以有完全重复并​​且没问题,可以将HAVING子句修改为COUNT(DISTINCT parameter_id)。

答案 2 :(得分:3)

如果我理解标准:对于ReviewIDdeduction_id的每个组合,您只能有一个parameter_id,并且您希望查询生成结果而不 ReviewIDs打破这些规则(而不是识别那些行)。这样就可以了:

;WITH review_errors AS (
  SELECT  ReviewID
  FROM test
  GROUP BY ReviewID,deduction_ID
  HAVING COUNT(DISTINCT parameter_id) > 1
)
SELECT t.*
FROM test t
  LEFT JOIN review_errors r
    ON t.ReviewID = r.ReviewID
WHERE r.ReviewID IS NULL

要解释:review_errorscommon table expression(将其视为命名子查询,不会使主查询混乱)。它选择违反标准的ReviewID。当您离开它时,它会选择左表中的所有行,无论它们是否与右表匹配,只选择右表中与左表匹配的行。不匹配的行在右侧表的列中将具有空值。通过指定WHERE r.ReviewID IS NULL,您可以消除左侧表中与右侧表匹配的行。

SQL Fiddle