我的表结构大致如下(我省略了更多列)
WEAPON MUNITION RANGE
我正在编写一个查询来检查一个表,其中包含许多具有不同范围的 WEAPON-MUNITION 配对。我需要找到武器弹药具有不同射程的每个实例。允许重复,因为此表中有多个数据集。是的,它违反了规范化,但我没有做到,我只需要查询它。
所以假设我有四个不同范围的武器弹药配对,我需要能够显示它们以便可以纠正它们。我尝试了一些复杂的 CTE 和非常复杂的自连接,但是当我认为我有结果时,我无法将它绑定回原始表,因为我认为是主键的列在数据集之间有重复!找到上述记录后,我需要显示整个记录。我最终得到的行数几乎是我开始时的 10 倍,但我不知道为什么。
没有要求 DBA 允许我为每条记录生成唯一的密钥,我不知道如何实现这一点。
编辑 使用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(如数据集)中包含更多列以形成某种自然键?