0

概述

我有 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 部分始终保持不变,并且快速完成”

4

0 回答 0