【发布时间】:2019-05-31 19:58:12
【问题描述】:
我已经查看了有关 group by 和 distinct 的所有问题,它们在允许聚合函数方面似乎有所不同,但没有一个回答我的问题......所以这里是......
我有一个包含 126266 行数据的数据库表,每个完整的行都应该是唯一的,但我没有使用行号。 我试图在这个表中找到所有重复的值(因为我知道它们存在),然后删除它们。没有一列是聚合。
表:
CREATE TABLE [dbo].[DBAScanResults](
[ScanNumber] [float] NOT NULL,
[DB_ID] [bigint] NOT NULL,
[PluginID] [bigint] NOT NULL,
[PluginID_Version] [bigint] NOT NULL,
[Result] [nvarchar](50) NULL,
[ActualValue] [nvarchar](max) NULL
我有外键:ScanNumber、DB_ID、PluginID_Version。每个相关的主键都在不同的表上。 (所以我的数据库目前是四个表)
如果我进行分组,它会给我 12745 行,这是我的重复行:
Select top 1000000 [ScanNumber]
,[DB_ID]
,[PluginID]
,[PluginID_Version]
,[Result]
,[ActualValue]
FROM [ITSecMaster].[dbo].[DBAScanResultsNew]
group by [ScanNumber]
,[DB_ID]
,[PluginID]
,[PluginID_Version]
,[Result]
,[ActualValue]
HAVING COUNT(*) >1
如果我做一个独特的( Select distinct * from [dbo].[DBAScanResults]),它会给我 78,871 行,我猜这是我唯一没有重复的行数。我这里的问题是 12745+78871 不等于 126226 ...
那么到底哪一个是正确的?我有 12745 个重复项还是 47,355 个重复项? 一旦我确定了哪个是正确的,我就需要从表中删除重复的值......通常我会这样做以删除带有 fk 的值,但我无法为多个 fks 获得正确的语法跨越 2 张以上的桌子。
DELETE a
FROM DBAScanResults a
INNER JOIN DBAScanDate b
ON a.ScanNumber = b.ScanNumber
WHERE (expression)
对此的任何帮助将不胜感激。
提前致谢!
【问题讨论】:
-
请告诉我们从表中删除记录的逻辑是什么。您要删除所有个重复记录,还是保留其中的 1(或 2)条?
-
我想删除除 1 个之外的所有重复值。所以在你的` text ---- A B B C C C `表中,我希望最终输出是` text ---- A B C `
-
你的数据库是什么? SQL Server、Oracle 还是其他?
-
SQL...我在帖子中使用了 SQL 标记...抱歉没有更具体地指出它...
-
啊。抱歉@a_horse_with_no_name - 但感谢您的澄清。它是 SQL Server....
标签: sql sql-server duplicates