SQL错误子查询返回了多个值
当我更改PlanningDate期间时,出现以下错误。因为一个计划时间有不止一个“项目名称,标题”。我试图将其更改为“加入”,但无法获得预期结果。请帮忙 Msg 512,级别16,状态1,第1行子查询返回的值超过1 价值当子查询在=、!=、=或者当子查询用作表达式时SQL错误子查询返回了多个值,sql,sql-server,tsql,Sql,Sql Server,Tsql,当我更改PlanningDate期间时,出现以下错误。因为一个计划时间有不止一个“项目名称,标题”。我试图将其更改为“加入”,但无法获得预期结果。请帮忙 Msg 512,级别16,状态1,第1行子查询返回的值超过1 价值当子查询在=、!=、=或者当子查询用作表达式时 很明显,子查询返回多个值,因此不能以这种方式查询结果。您必须找到其他方法根据表结构查询结果。试想一下,查询中的任何一个子查询都会返回多个结果,select将如何工作?就这样 在SQL Server中,可以使用outer apply获
很明显,子查询返回多个值,因此不能以这种方式查询结果。您必须找到其他方法根据表结构查询结果。试想一下,查询中的任何一个子查询都会返回多个结果,select将如何工作?就这样 在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';
这将消除你的错误。然而,我猜结果并不是你想要的。你的问题没有明确说明你想要什么,所以这应该会让你走上一条更好的道路
注意:处理日期/时间时,应使用内置的日期/时间函数。您正在将它们转换为字符串,这只是一个坏主意。您不需要这样做,这会影响性能。请标记dbms产品。(此处的一些非ANSI SQL…)一个或两个子选择返回多行。要么关联(包括到外部级别表的条件),要么执行联接。我添加了SQL Server标记,因为语法看起来像SQL Server.rinesh,您能帮我修改编码吗?用户希望显示计划时间下的所有记录您可以使用联接来联接
ChannelID
上的Planning
和PlanningTime
表。这是简单而直接的。但是,我试图修改它以使用join,但它无法输出我所期望的结果!用户希望显示他们输入的所有记录!我展示的编码是编码的一部分,用户希望在rowGordon中的列和时间中显示日期,这是易于准备和理解的示例编码。我的程序编码定义了输入参数的日期和时间。你修改的编码不能显示我期望的结果!它显示了很多重复记录,甚至我使用的是DISTINCE。一些标题显示在错误的列中。用户需要在列中显示日期,在行中显示时间。某些字段应为空,因为某些时段没有记录。我尝试使用内部连接,它也显示了错误的结果。
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';