私のテーブル構造はおおよそ次のとおりです(除外している列が他にもあります)
WEAPON MUNITION RANGE
範囲が異なる多くの WEAPON-MUNITION ペアリングを持つ単一のテーブルをチェックするクエリを作成しています。WEAPON-MUNITION の範囲が異なるすべてのインスタンスを見つける必要があります。このテーブルには複数のデータ セットがあるため、重複が許可されます。はい、正規化に違反していますが、クエリを実行するだけで作成できませんでした。
たとえば、射程の異なる 4 つの武器と弾薬の組み合わせがあるとします。それらを表示して修正できるようにする必要があります。いくつかの複雑な CTE と非常に複雑な自己結合を試しましたが、結果が得られたと思うと、主キーだと思っていた列がデータセット間で重複しているため、元のテーブルに結び付けることができません! 上記のレコードを見つけた後、レコード全体を表示する必要があります。最初の行のほぼ 10 倍の行になってしまい、その理由がわかりません。
DBA に、すべてのレコードに対して一意のキーを生成できるように依頼する以外に、どうすればこれを達成できるかわかりません。
EDIT gregmacの例を使用して、このクエリを思いつきました(一般的で、いくつかの列と独自の情報を除外しています)
WITH range_cte AS
(
SELECT
d1.WEAPON
,d1.MUNITION
,d1.WEAPON
,d1.RANGE
,d1.ID --This is NOT a primary key! There are duplicates
FROM data1 d1 INNER JOIN data2 d2
ON d1.WEAPON = d2.WEAPON
AND d1.MUNITION = d2.MUNITION
AND d1.RANGE <> d2.RANGE
GROUP BY
d1.WEAPON
,d1.MUNITION
,d1.WEAPON
,d1.RANGE
,d1.ID
ORDER BY
d1.WEAPON
,d1.MUNITION
)
--Self join the CTE on the original table using the ID (that's not a primary key)
SELECT * FROM range_cte r INNER JOIN data d
ON r.ID = d.ID
私の考えは、テーブル全体に自動生成されたキーを挿入することですか、それとも CTE (データセットなど) にさらに列を含めて、ある種の自然キーを形成する必要がありますか?