【问题标题】:SQL error Subquery returned more than 1 valueSQL 错误子查询返回超过 1 个值
【发布时间】:2016-03-17 09:06:49
【问题描述】:

更改 PlanningDate 期间时出现以下错误。因为一个 PlanningTime 有多个“ProgrammeTitle, Title”。我试图将其更改为加入,但无法获得预期的结果。请帮忙

消息 512,级别 16,状态 1,第 1 行子查询返回超过 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'

【问题讨论】:

  • 请标记 dbms 产品。 (那里有一些非 ANSI SQL...)
  • 一个或两个子选择返回超过 1 行。要么关联(包括与外部级别表的条件),要么进行连接。
  • 我添加了 SQL Server 标记,因为语法看起来像 SQL Server。

标签: sql sql-server tsql


【解决方案1】:

很明显,您的子查询返回多个值,因此您不能以这种方式查询结果。您必须找到其他方法来根据您的表结构查询您的结果。试想一下,查询中的任何一个子查询都会返回多个结果,那么您的选择将如何工作?而已。

【讨论】:

  • rinesh,你能帮我修改一下编码吗?用户希望显示 PlanningTime 下的所有记录
  • 您可以使用 Joins 来加入 ChannelID 上的 PlanningPlanningTime 表。它简单明了。
  • rines,我尝试修改它以使用 join,但它无法输出我期望的结果!用户想要显示他们输入的所有记录!我展示的编码是编码的一部分,用户希望在列中显示日期并在行中显示时间
【解决方案2】:

在 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';

这将消除您的错误。但是,我猜结果并不完全是您想要的。您的问题没有具体说明您想要什么,因此这应该会让您走上更好的道路。

注意:在处理日期/时间时,您应该使用内置的日期/时间函数。您正在将它们转换为字符串,这简直是个坏主意。您不需要这样做,它会影响性能。

【讨论】:

  • Gordon,这是易于准备和理解的示例编码。我的程序编码已经定义了输入参数的日期时间。您修改后的编码无法显示我预期的结果!即使我使用 DISTINCT,它也显示了很多重复记录。一些标题显示在错误的列中。用户在列中显示日期和在行中显示时间。由于某些时间段没有记录,某些字段应为空白。我尝试使用内部连接,它也显示错误的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多