6

これは私が扱っているテーブルです:

テーブル

パラメーターごとに重複する控除 ID を持つ ReviewID のみを特定したいと考えています。

たとえば、上の画像では、ReviewID 114 に 2 つの異なるパラメーター ID がありますが、両方のレコードに同じ推論 ID があります。

私の目的では、このレコード (ReviewID 114) にはエラーがあります。1 つの ReviewID に対して同じ控除 ID を持つ一意のパラメーター ID が 2 つ以上存在してはなりません。

これらのタイプのレコードを識別するためのクエリを作成したいと考えていますが、SQL のスキルはまだありません。ヘルプ?

ありがとう!

更新 1: TSQL (SQL Server 2008) を使用しています
。更新 2:探している出力は、上記の画像と同じですが、説明した条件に一致しないレコードはありません。

乾杯!

4

3 に答える 3

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 に答える
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 に答える
3

基準を理解している場合:ReviewIDとの組み合わせごとに parameter_id を 1 つだけ持つことができ、それらのルールに違反する ReviewIDsなしdeduction_idで結果を生成するクエリが必要です(違反する行を識別するのではなく)。これはそれを行います:

;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 を選択します。結合を残すと、右側のテーブルと一致するかどうかに関係なく、左側のテーブルからすべての行が選択され、左側のテーブルと一致する右側のテーブルの行のみが選択されます。一致しない行は、右側のテーブルの列に null があります。指定することによりWHERE r.ReviewID IS NULL、右側のテーブルと一致する行を左側のテーブルから除外します。

SQL フィドル

于 2013-03-13T01:23:59.463 に答える