不使用 EXISTS 引入子查询时,选择列表中只能指定一个表达式

Posted

技术标签:

【中文标题】不使用 EXISTS 引入子查询时,选择列表中只能指定一个表达式【英文标题】:Only one expression can be specified in the select list when the subquery is not introduced with EXISTS 【发布时间】:2011-08-04 08:54:04 【问题描述】:

我有一个SQL query,它选择了一些值(并以连接的形式跨表工作)。其中一个字段返回 0 或 1,但我想在 0 或 1 的情况下返回其他内容(是/否)。

代码:

SELECT Passed, 
       CASE Passed
            WHEN '1' THEN 'Yes'
            ELSE 'No'
       END
FROM EXAM_INSTANCE

效果很好。

但是当我将它作为子查询集成到存储过程中时,我得到了错误:

Only one expression can be specified in the select list when the sub-query is not introduced with EXISTS.

原来的查询是:

select Firstname, Lastname, ei.Started, 
       ((ei.totalcorrect*100)/@examQuestionCount) as percentage, passed, ei.InstanceID
from ea ei, INVITE i, OSTTable ost, f f
where ei.Finished is not null
      and ei.InviteID = i.InviteID 

我正在尝试:

   select Firstname, Lastname, ei.Started, 
          ((ei.totalcorrect*100)/@examQuestionCount) as percentage, 
   (SELECT Passed, 
           CASE Passed
                WHEN '1' THEN 'Yes'
                ELSE 'No'
           END
     FROM EA), 
     ei.InstanceID
 from EA E ei, INVITE i, osttable ost, ef e
 where ei.Finished is not null
       and ei.InviteID = i.InviteID 

我的错误的原因是什么?

PS 出于隐私原因,我已经更改了表名,所以如果它们不匹配,请不要担心。

【问题讨论】:

那里有一大堆 CROSS JOIN。即使修复了子查询,这是否有效? 【参考方案1】:

该位置的子查询预计返回不超过一个值(即一行中的一列),但您的子查询返回两列(一列是Passed,另一列是由 CASE 表达式表示的未命名列) 我不知道有多少行。

您应该将子查询的结果集成到您的主查询中(类似于@Alex_L 建议的内容)或将子查询的输出限制为预期的值数量。

【讨论】:

【参考方案2】:
select Firstname, Lastname, ei.Started, 
          ((ei.totalcorrect*100)/@examQuestionCount) as percentage,
           passed_ = CASE Passed
                WHEN '1' THEN 'Yes'
                ELSE 'No'
           END,
     ei.InstanceID
 from EA E ei, INVITE i, osttable ost, ef e
 where ei.Finished is not null
       and ei.InviteID = i.InviteID 

【讨论】:

【参考方案3】:
USE [IAS_AccountDB]
GO
/* Object:  StoredProcedure [dbo].[Prc_Accounts_LastNodes]    Script Date: 04/01/2013 01:29:20 */
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Prc_Accounts_LastNodes]
(
    @AccountParentID int = NULL
)
AS
SELECT 
    [Accounts].[AccountName] 
    ,[Accounts].[AccountID] 
FROM
    [Accounts] 
WHERE
    @AccountParentID IN
    (
        SELECT
            [Accounts].[AccountID]
            ,[Accounts].[AccountName]
            ,[Accounts].[AccountStandardCode]
        FROM     
            [Accounts]
        WHERE
         NOT EXISTS
         (
            SELECT TOP 1
                1
            FROM
                [Accounts_ParentIDs]
            WHERE
                [Accounts_ParentIDs].[AccountParentID] =  [Accounts].[AccountID] 
         )


    ) 

RETURN 0;

【讨论】:

只有代码或 SQL 的答案很少是好的答案。您还应该考虑在答案中添加一些解释性文字。

以上是关于不使用 EXISTS 引入子查询时,选择列表中只能指定一个表达式的主要内容,如果未能解决你的问题,请参考以下文章

创建函数时出错 - 如果不使用 EXISTS 引入子查询,则选择列表中只能指定一个表达式

不使用 EXISTS 引入子查询时,选择列表中只能指定一个表达式

当不使用 EXISTS 引入子查询时,选择列表中只能指定一个表达式。 - SQL 服务器

不使用 EXISTS 引入子查询时,选择列表中只能指定一个表达式

SQL - 当不使用 EXISTS 引入子查询时,选择列表中只能指定一个表达式

不使用 EXISTS 嵌套 case 语句引入子查询时,选择列表中只能指定一个表达式