我有两组文件路径,文件路径都包含一个UID, 文件名的一部分。
我必须制作一些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]
使用'slickmacs'的uname为DirFiles表提供一组路径 路径采用以下形式:
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之外,此路径中的所有内容都会发生更改。重命名后,我们想要找到 BrainAttachment 使用UID和Root限定符进行进一步处理。 进一步处理的输入是附件guid和来自 DirFiles 的新的重命名路径。
在这里尝试视图......
-- 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,但我不想执行该函数计数(T1)* count(T2)次,我不想使用temp表。
在英语中,“给我所有在磁盘上名称已更改的附件,假设文件名的UID部分始终保持不变,并快速执行”