6

这是我正在使用的表:

桌子

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

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

出于我的目的,这条记录 (ReviewID 114) 有一个错误。对于单个 ReviewID,不应有两个或多个具有相同扣除 ID 的唯一参数 ID。

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

谢谢!

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

干杯!

4

3 回答 3

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

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

于 2013-03-13T00:43:28.827 回答
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)。

于 2013-03-13T01:14:19.927 回答
3

如果我理解标准:对于 and 的每种组合,ReviewIDdeduction_id只能有一个 parameter_id,并且您希望查询产生的结果没有违反这些规则的 ReviewID(而不是识别那些违反这些规则的行)。这将做到这一点:

;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_errors是一个通用表表达式(将其视为一个命名的子查询,不会使主查询混乱)。它选择打破标准的 ReviewID。当您对其进行左连接时,它会选择左表中的所有行,无论它们是否与右表匹配,并且仅选择右表中与左表匹配的行。不匹配的行将在右侧表的列中包含空值。通过指定WHERE r.ReviewID IS NULL,您可以从左侧表中消除与右侧表匹配的行。

SQL小提琴

于 2013-03-13T01:23:59.463 回答