【问题标题】:SQL Server / Report Builder subquery returns more than one row errorSQL Server / Report Builder 子查询返回多行错误
【发布时间】:2017-11-27 12:57:10
【问题描述】:

我很难弄清楚为什么报表生成器中的子查询返回多行。

(
    SELECT 
    (
        CASE
            WHEN C.CourseCode IN ('50089079','50089080') THEN 'L2 Maths FS'
            WHEN C.CourseCode IN ('50089067','50089109') THEN 'L1 Maths FS'
            WHEN C.CourseCode IN ('50084987','50092959') THEN 'E3 Maths FS'
            WHEN C.CourseCode IN ('50084975','50091967') THEN 'E2 Maths FS'
            WHEN C.CourseCode IN ('50084963','50091724') THEN 'E1 Maths FS'
            WHEN C.CourseCode IN ('60146084') THEN 'GCSE Maths'
            Else 'NA'
        END
    )
    FROM
        Enrolment E
    INNER JOIN 
        Course C ON C.CourseID = E.CourseID
    WHERE 
        E.PMStudentID = vReports_Enrolment.PMStudentID
        AND C.CourseCode IN ('50089079', '50089080', '50089067', '50089109', '50084987', '50092959', '50084975', '50091967', '50084963', '50091724', '60146084')
        AND vReports_Enrolment.CompletionID = 1
) 

这是弹出此错误的特定学习者的数据 - 我已经突出显示,如果不是检查 CompletionID 是否为“1”,通常会返回 2 行:

CourseCode  CompletionID  
-------------------------
50044357    1 
50044369    1
50089079    0   
60146084    1
60187578    1
60148366    1

在这种情况下,预期的行为是返回“GCSE 数学”——我做错了吗?

【问题讨论】:

  • 您发布的当前输出与位于其上方的查询不直接对应。你能编辑你的问题吗?关于您的错误,这是不言自明的。您在 select 子句中有一个返回多个记录/值的子查询,这是没有意义的。
  • 整个查询量很大,只是这部分掉了下来。我希望,根据 CASE,如果 CourseCode 在指定的范围内并且它的 CompletionID 是 1,它会返回 1 个值。
  • 我们需要查看整个查询。是的,选择子句中的单个 CASE 表达式不应触发此错误,这就是为什么这可能不是问题的原因。
  • 刚刚将TOP 1 添加到选择中...似乎有效-耸耸肩-

标签: sql sql-server ssrs-2012 reportbuilder3.0


【解决方案1】:

在某些情况下,您有两行或更多行。

使用 TOP 1 只会选择第一个,这并不能保证它就是您想要的,尤其是当您的数据没有您想象的那么干净时。

使用SELECT DISTINCT ... 更安全。这样,如果所有返回的行都相同,只是重复,那么您将得到正确的答案。如果仍然出现错误,则需要调查子查询结果。

【讨论】:

    【解决方案2】:

    添加:

    (
        SELECT TOP 1
        (
            CASE
    

    确保只返回一行,这是预期的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      • 2014-02-15
      • 1970-01-01
      相关资源
      最近更新 更多