更改PlanningDate期间时出现以下错误。因为一个PlanningTime有多个“ProgrammeTitle,Title”。我尝试将其更改为加入,但无法获得我期望的结果。请帮忙
Msg 512,Level 16,State 1,Line 1 Subquery返回的值超过1 值。子查询遵循=,!=,<,< =时,不允许这样做, >,> =或当子查询用作表达式时。
select pt.PlanningTime,
(SELECT (LTRIM(RTRIM(ProgrammeTitle+':'+Title)))
FROM Planning
where ChannelID = '34'
and CONVERT(char(8),PlanningDate,112) between '20130101' and '20130107'
and pt.PlanningTime = PlanningTime
and DATEPART(dw,PlanningDate)=1) AS Title1,
(SELECT (LTRIM(RTRIM(ProgrammeTitle+':'+Title)))
FROM Planning
where ChannelID = '34'
and CONVERT(char(8),PlanningDate,112) between '20130101' and '20130107'
and pt.PlanningTime = PlanningTime
and DATEPART(dw,PlanningDate)=2) AS Title2
FROM PlanningTime pt
where pt.ChannelID = '34'
and CONVERT(char(8),pt.PlanningDate,112) between '20130101' and '20130107'
答案 0 :(得分:0)
很明显,您的子查询会返回多个值,因此您无法以这种方式查询结果。您必须找到一些其他方法来根据您的表结构查询结果。只要认为查询中的任何一个子查询都会返回多个结果,您的选择将如何工作?而已。
答案 1 :(得分:0)
在SQL Server中,您可以使用outer apply
获取所有行:
SELECT pt.PlanningTime, p1.Title1, p2.Title2
FROM PlanningTime pt OUTER APPLY
(SELECT (LTRIM(RTRIM(ProgrammeTitle+':'+Title)))
FROM Planning
WHERE ChannelID = '34' and
CONVERT(char(8),PlanningDate,112) between '20130101' and '20130107' and
pt.PlanningTime = PlanningTime and
DATEPART(dw, PlanningDate) = 1
) p1 OUTER APPLY
(SELECT (LTRIM(RTRIM(ProgrammeTitle+':'+Title)))
FROM Planning
WHERE ChannelID = '34' AND
CONVERT(char(8),PlanningDate,112) between '20130101' and '20130107'
pt.PlanningTime = PlanningTime and
DATEPART(dw,PlanningDate)=2
) p2
where pt.ChannelID = '34' and
CONVERT(char(8),pt.PlanningDate,112) between '20130101' and '20130107';
这将消除您的错误。但是,我猜测结果并不完全符合您的要求。你的问题没有说明你想要的东西,所以这应该让你走上更好的道路。
注意:使用日期/时间时,应使用内置日期/时间功能。您正在将它们转换为字符串,这简直是一个坏主意。您不需要这样做,而且会影响性能。