Sql从SELECT语句引用WITH子句实体

时间:2012-11-15 13:07:49

标签: sql sql-server

概述

我有两组文件路径,文件路径都包含一个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]

文件路径

使用'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 的新的重命名路径。

障碍:避免分层视图,非常糟糕的性能。避免使用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,但我不想执行该函数计数(T1)* count(T2)次,我不想使用temp表。

在英语中,“给我所有在磁盘上名称已更改的附件,假设文件名的UID部分始终保持不变,并快速执行”

0 个答案:

没有答案