我创建了一个在SQL Server 2008上运行的SQL查询。出于某种原因,它需要很长时间,而且时间不完整。
这是我的查询修改以用于测试目的。列FileData
是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)
中的子查询可以自行运行,如果删除主查询的那部分主查询运行正常。只有CASE
和子查询的组合才会导致问题。
希望通过查看上面的内容,有人会看到问题,这可能是T-SQL中无法实现的此类查询的一些问题?
答案 0 :(得分:1)
你并没有向我们提供太多信息,但无论如何:subselect为每一行运行,所以当你有一个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