概要
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」の uname を使用して一連のパスが供給されます。パスは次の形式を取ります。
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))
)
)
概要
したがって、基本的には、2 つのテーブルのファイルパスから UID を取得する計算 f(x) がありますが、その関数を count(T1)*count(T2) 回実行したくなく、一時テーブルを使用したくありません。
英語では、「ファイル名の UID 部分が常に一定のままであることを考えると、ディスク上で名前が変更されたすべての添付ファイルを私に渡してください。すぐに実行してください。」