SQL:查询不能正确返回重复项

时间:2015-05-22 10:02:04

标签: sql sql-server

我使用SQL Server 2014 Express。

我有一张包含各种职业战斗信息的表格。我已经为每一行分配了自己的战斗ID。

有时,使用不同的战斗ID会多次记录有关同一战斗的信息。我的目标是识别这些重复项,然后从我的表中删除它们。

这是创建我的表的代码:

CREATE TABLE [dbo].[Fights](
    [FightId] [int] IDENTITY(1,1) NOT NULL,
    [LowIdFighter] [int] NOT NULL,
    [HighIdFighter] [int] NOT NULL,
    [LowIdFighterOutcome] [nvarchar](100) NOT NULL,
    [EventName] [nvarchar](100) NOT NULL,
    [EventDate] [datetime] NOT NULL,
    [WinningMethod] [nvarchar](100) NOT NULL,
    [Referee] [nvarchar](50) NOT NULL,
    [FinishingRound] [int] NOT NULL,
    [FinishingTime] [time](7) NOT NULL,
 CONSTRAINT [PK_Fights] PRIMARY KEY CLUSTERED 
(
    [FightId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

这是我的问题:

SELECT 
    LowIdFighter, HighIdFighter, CAST(EventDate AS DATE),
    LowIdFighterOutcome,
    COUNT(*) as NumTimesSaved
INTO Duplicate_Fights
FROM Fights
GROUP BY 
    LowIdFighter, HighIdFighter, EventDate, 
    LowIdFighterOutcome
HAVING COUNT(*) > 1;
GO

我的问题是:表Duplicate_Fights包含实际上并不重复的战斗。战斗被认为是重复的,因为它们在任何四列中的两列(LowIdFighter,HighIdFighter,EventDate,LowIdFighterOutcome)中共享相同的值。例如,如果两个战斗共享相同的LowIdFighter-HighIdFighter对,则认为两个战斗相互重复,即使这两个战斗机在两个完全不同的事件中作战,可能有两个完全不同的结果。显然,这不是我想要的。

我想编写一个查询表达式,该表达式返回重复战斗的表,这些战斗在四列的 all 中共享相同的值。我很感激有关此事的任何帮助。谢谢。

编辑:这是我排除" HAVING COUNT(*)>时输出的屏幕截图1"语句:

enter image description here

第149行和第150行彼此重复,因为这两行中的日期不同,但它们包含在重复战斗表中。

2 个答案:

答案 0 :(得分:1)

这两行并不相互重复,但两者都存在两次,即战斗机45386有两次战斗,两次都被插入两次。

答案 1 :(得分:1)

我只是想帮忙。

您的查询应该按照 dnoeth 的建议运行,但只需确保在 GROUP BY中使用相同属性(或其操作)用于检索列(