不使用 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 引入子查询时,选择列表中只能指定一个表达式