0

我创建了一个在 SQL Server 2008 上运行的 SQL 查询。由于某种原因,它需要很长时间并且超时不完整。

这是我为测试目的而修改的查询。列FileData是 a varbinary(max),主键是ContentFileId。如您所见,我只是想选择一个特定的记录。

SELECT *,
       CASE
         WHEN [CMS_tbContentFile].[FileData] IS NULL 
         THEN (
                SELECT [CMS_tbContentFile2].[FileData]
                FROM   [CMS_tbContentFile] AS [CMS_tbContentFile2]
                WHERE  [CMS_tbContentFile2].[ContentFileId] = 2152  
              )
         ELSE [CMS_tbContentFile].[FileData]
       END AS [Test]
FROM   [CMS_tbContentFile]
WHERE  [CMS_tbContentFile].[ContentFileId] = 3054  

子查询CASE (SELECT [CMS_tbContentFile2].[FileData] FROM [CMS_tbContentFile] AS [CMS_tbContentFile2] WHERE [CMS_tbContentFile2].[ContentFileId] = 2152)本身运行良好,如果我删除主查询的那部分,主查询运行良好。只有 theCASE和子查询的组合会导致问题。

希望通过查看上述内容,有人会看到问题,可能这种类型的查询存在一些问题,而在 T-SQL 中是不可能的?

4

1 回答 1

1

您并没有给我们太多信息,但无论如何:子选择针对每一行运行,因此当您有 1000 个 [CMS_tbContentFile].[ContentFileId] = 3054 字段时,它可以/将执行 1000 次。

尝试下面的代码或尝试将其重写为连接。

declare @field varchar(255) //define here the same type as the [filedata] column has
select 
   @field = [cms_tbcontentfile2].[filedata] 
from 
   [cms_tbcontentfile] as [cms_tbcontentfile2]
where 
   [cms_tbcontentfile2].[contentfileid] = 2152

SELECT 
   *, 
   isnull([CMS_tbContentFile].[FileData], @field) as [Test]
FROM 
   [CMS_tbContentFile] 
WHERE 
   [CMS_tbContentFile].[ContentFileId] = 3054
于 2011-12-13T08:40:42.673 回答