概述
我有 2 组文件路径,文件路径都包含 UID 作为文件名的一部分。
- 完整路径集位于表DirFiles中,这些文件名会因外力而改变,但 UID 部分永远不会改变。
- 位置集位于作为更新目标的表BrainAttachments中。
我必须制作一些 XML 来进行更新,所以这不是典型的表更新。我正在尝试构建一个查询。
数据布局
-- contains various file paths, grouped as sets by uname
CREATE TABLE [dbo].[DirFiles](
[id] [int] IDENTITY(1,1) NOT NULL,
[uname] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[fullpath] [varchar](300) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
) ON [PRIMARY]
-- file attachments table, 'location' field contains a file path
CREATE TABLE [dbo].[BrainAttachments](
[brain_guid] [uniqueidentifier] NOT NULL,
[guid] [uniqueidentifier] NOT NULL,
[location] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
...more...
) ON [PRIMARY]
文件路径
DirFiles 表使用一组名为 'slickmacs' 的路径提供路径,路径采用以下形式:
ROOT QUALIFIER | MODULE | SIGNATURE | BACKWARDS PATH | FILE | UID | EXT
C:\SlickEdit2007\macros\@\__appact\cmd appact_slickhelp()-typeless --__appact--macros--Slickedit2007--C--__appact.e.7946371600659277.#+!
用例:重命名
除了根限定符和 UID 之外,此路径中的所有内容都可能发生更改。重命名后,我们希望找到 具有 UID 和根限定符的BrainAttachment以进行进一步处理。进一步处理的输入是附件 guid 和来自DirFiles的新的重命名路径。
障碍:避免分层视图,对性能非常不利。避免使用 temp_tables。所以我们使用 WITH 子句...
尝试在这里观看...
-- query currently executes in 2-3 secs WITHOUT the field I desire
;WITH
-- slickmacs: getting a list of all paths under 'slickmacs' and
-- extracting the UID, aka 'zdot'
-- 7000 records under uname='slickmacs'
slickmacs(fullpath,zdot) as
(
SELECT fullpath,dbo.fnPathZdotPart(fullpath)
FROM dbo.DirFiles
WHERE (uname = 'slickmacs')
),
-- find attachments that qualify, but their location is not in slickmacs
-- 10,000 records in BrainAttachments WHERE 1=1
location_notin(guid,location) as
(
SELECT guid,location
FROM dbo.BrainAttachments BA
WHERE (NOT EXISTS
(SELECT fullpath
FROM slickmacs
WHERE (BA.location = fullpath)))
AND (SUBSTRING(location, 1, 26) = 'C:\SlickEdit2007\macros\@\')
AND (SUBSTRING(dbo.fnPathFileExt(location), 1, 1) = '#')
AND (brain_guid = dbo.GuidOfSlickKeys())
),
-- I am trying to 'float up' the fullpath here so I can
-- get at it below in my SELECT
location_notin_fp(guid,fullpath) as
(
select guid
,(select fullpath from slickmacs
where zdot=dbo.fnPathZdotPart(LNI.location)
) as fullpath
from location_notin LNI
)
-- PROBLEM: Here for the second field, I want the fullpath
SELECT guid
-- METHOD 1: takes 2 minutes
-- ,(select fullpath from location_notin_fp
-- where guid=BA.guid
-- ) as fullpath
-- METHOD 2: takes 2 minutes
-- ,(select fullpath from slickmacs
-- where zdot=dbo.fnPathZdotPart(BA.location)
-- ) as fullpath
FROM dbo.BrainAttachments BA
-- ALTERNATE METHODS: Gets errors
-- METHOD 3: Error: identifiers not found: dbo.BrainAttachments.guid,location_notin_fp.guid
--INNER JOIN location_notin_fp LNO ON dbo.BrainAttachments.guid=location_notin_fp.guid
-- METHOD 4: Error: identifiers not found: dbo.BrainAttachments.guid
--INNER JOIN (select * from location_notin_fp ) as LNF ON dbo.BrainAttachments.guid=LNF.guid
-- METHOD 5: Error: ambiguous column name: guid
--INNER JOIN (select * from location_notin_fp ) as LNF ON BA.guid=LNF.guid
-- get where location not in fullpaths and location.zdot in fullpaths.zdot
WHERE
(EXISTS
(SELECT * FROM location_notin
WHERE (BA.guid = guid)
)
)
AND (EXISTS
(SELECT fullpath FROM slickmacs
WHERE (zdot=dbo.fnPathZdotPart(BA.location))
)
)
概括
所以基本上我有一个计算 f(x) 从两个表中的文件路径获取 UID,但我不想执行该函数 count(T1)*count(T2) 次,我不想使用临时表。
在英语中,“给我磁盘上所有名称已更改的附件,因为文件名的 UID 部分始终保持不变,并且快速完成”