gpt4 book ai didi

sql - 使用 DISTINCT 标准化数据

转载 作者:行者123 更新时间:2023-12-02 08:58:49 24 4
gpt4 key购买 nike

我的每台 PC 每月有 1,000,000 行由某些监控软件生成。 DataToImport(临时)表如下所示:

EventID    int           NOT NULL   (Primary Key of denormalized table)
EventType int NOT NULL -- A enumerated value
Computer nvarchar(50) NOT NULL -- Usually computer name
When DateTime NOT NULL
FileRef int NOT NULL -- File generators reference
FileDesc nvarchar(100) NOT NULL -- Humanly-readable description
FilePath nvarchar(100) NOT NULL -- Relative Path on disk

我正在尝试将这些数据标准化为几个表:

Computer (UniqueID, Name)
File (UniqueID, FileRef, FileDesc, FilePath)
Event (ID, Type, ComputerUniqueID, When, FileUniqueID)

..这样“事件”将有无数行,但它们非常小,因此数据库大小是可以管理的,并且可以为表建立索引以提高查询性能:

-- Grab new computers
INSERT INTO Computer
SELECT [Computer] AS [Name]
FROM [DataToImport]
WHERE [DataToImport].[Computer] NOT IN (SELECT [Name] FROM [Computer])

-- Grab new files
INSERT INTO File
SELECT [FileRef], [FileDesc], [FilePath]
FROM [DataToImport]
WHERE [FileRef] NOT IN (SELECT [FileRef] FROM File)

-- Normalize rows
INSERT INTO Event
SELECT [EventID], [EventType], [Computer].[UniqueID], [File].[UniqueID]
FROM [DataToImport]
INNER JOIN [Computer] ON [DataToImport].[Computer] = [Computer].[Name]
INNER JOIN [File] ON [DataToImport].[FileRef] = [File].[FileRef]

..这一切看起来都很棒,除了三元组(FileRef、FileDesc、FilePath)实际上是一个复合键,因为这三个项目中的任何一个都可以变化,并且这代表一个唯一的条目。我需要提取不同三元组来插入它们...

-- Grab new distinct files
INSERT INTO File
SELECT DISTINCT [FileRef], [FileDesc], [FilePath]
FROM [DataToImport]
WHERE [FileRef] NOT IN (errrrr....help!)

如何确保唯一的文件行标准化?

最佳答案

我会用

INSERT [File] ([FileRef], [FileDesc], [FilePath])
select distinct [FileRef], [FileDesc], [FilePath]
from [DataToImport]
except select [FileRef], [FileDesc], [FilePath]
from [File]

...但我首先将其性能与 Quassnoi 的 SELECT...INTERSECT 解决方案进行比较。

关于sql - 使用 DISTINCT 标准化数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2875496/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com