我有一种情况需要创建一个查询,其中我的查询的过滤器需要2个可能位置中的1个的结果集。
我开始在线搜索,看看是否有办法使用这样的CASE
语句:
A.Column IN (CASE EXISTS()...THEN (SELECT...)... END)
并且找不到任何确定的答案,所以我尝试自己制作这样的东西,但是我得到以下错误,我不明白为什么:
子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。
简单来说,我希望我的查询要做的只是根据报告类型过滤掉包裹中包含合同的包裹,其中包含名为Contracts
的驱动程序表。有些报告在驱动程序表中有很多合同,有些报告没有。如果报表类型在驱动程序表中没有合同,请使用所有可能的合同。我的约束是不使用动态SQL,因此可以将此查询放入表值函数
我的查询如下:
SELECT DISTINCT
IDNum, PName, County, CountyDescription,
DATENAME(MONTH, ptn) AS ptn_mt_char,
YEAR(ptn) AS ptn_yr,
MONTH(ptn) AS ptn_mt,
ptn
FROM
(SELECT
A.ID AS IDNum,
A.PName, A.County, A.CountyDescpription,
dbo.udf_getPtn(A.ID,
CAST(@ReportType AS VARCHAR),
CAST(@DataDate AS VARCHAR),
CAST(@montha AS VARCHAR),
CAST(@monthb AS VARCHAR),
CAST(@total_fa AS VARCHAR),
CAST(@total_fb AS VARCHAR)) AS ptn
FROM
DB.dbo.PData A
LEFT JOIN
DB.dbo.FData B ON A.ID = B.ID
WHERE
A.Contract IN (CASE WHEN EXISTS(SELECT cnt FROM dbo.Contracts WHERE ReportType = @ReportType AND SubReportType = @SubReportType)
THEN (SELECT cnt FROM dbo.Contracts WHERE ReportType = @ReportType AND SubReportType = @SubReportType)
ELSE (SELECT DISTINCT ConC FROM DB.dbo.PData)
END)) A
WHERE
ptn IS NOT NULL
ORDER BY
ptn, IDNum
答案 0 :(得分:1)
CASE
表达式无法返回多个值,因此您无法按照您的想法将其与IN
结合使用。您可以像这样重写WHERE
子句:
WHERE (
A.Contract IN (SELECT cnt
FROM dbo.Contracts
WHERE ReportType = @ReportType AND
SubReportType = @SubReportType)
)
OR
(
NOT EXISTS (SELECT 1
FROM dbo.Contracts
WHERE ReportType = @ReportType AND
SubReportType = @SubReportType)
AND
A.Contract IN (SELECT DISTINCT ConC FROM DB.dbo.PData)
)
答案 1 :(得分:0)
我建议你创建两个视图来规范化两个表之间的列选择(并使用查询分析器独立地优化它们),然后在你的sproc中加入它们并过滤新的“组合”列。