为什么这个SQL子查询语句不起作用?
该语句产生以下错误 子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时 我想我需要连接子查询中的字段名为什么这个SQL子查询语句不起作用?,sql,sql-server,Sql,Sql Server,该语句产生以下错误 子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时 我想我需要连接子查询中的字段名 SELECT ( SELECT COALESCE(Table_Field, Field) AS Fields FROM API_Objects_Fields WHERE Field IN ( 'fullname' ,'confirmed'
SELECT (
SELECT COALESCE(Table_Field, Field) AS Fields
FROM API_Objects_Fields
WHERE Field IN (
'fullname'
,'confirmed'
,'primary_email'
,'location_short'
)
)
FROM user_basics U
INNER JOIN Pod_Membership PM ON U.UserID = PM.UserID
WHERE PM.PodID = 164
ORDER BY U.Ctime DESC
子查询指定要从表返回的字段
WITH CTE AS
(SELECT (
SELECT DISTINCT TOP 1 COALESCE(Table_Field, Field)
FROM API_Objects_Fields F
WHERE F.UserID = PM.UserID AND F.Field IN (
'fullname'
,'confirmed'
,'primary_email'
,'location_short'
)
)AS Fields,
ROW_NUMBER()OVER (PARTITION BY Table_Field ORDER BY FIELD)AS RN
FROM user_basics U
INNER JOIN Pod_Membership PM ON U.UserID = PM.UserID
WHERE PM.PodID = 164
ORDER BY U.Ctime DESC
)
Select * from CTE WHERE RN = 1
这是一个基于您的问题的假设查询
DECLARE @Name VARCHAR(1000)
Select @Name =
COALESCE(@Name,'') +Table_Field + ';'
FROM API_Objects_Fields
WHERE Field IN
( 'fullname' ,'confirmed' ,'primary_email' ,'location_short' )
Select @Name As FieldName
@akfkmupiwu需要对上述评论执行类似操作错误告诉您的是什么
查询的问题正是错误所说的,它会返回多个结果。由于子查询位于外部查询的select部分,而不是from或where,因此sql正在寻找一个值来填充特定列。更多地考虑填写excel电子表格。不能向一个单元格中添加两个单独的值。相反,您需要将数据分为两行
另一方面,coalesce检查第一个值是否为null,如果为null,则返回第二个值。如果第一个值不为null,则返回该值。我觉得这不是你想要的行为
如何解决这个问题
您需要更改查询,以便为字段可以是的每个可能的值提取不同的行,或者需要找到一种方法,只为字段指定一个要返回的值。由于我不确定您在寻找什么,我将演示解决此问题的第一种方法
资料
你的问题没有提供API_Objects_字段的任何数据,所以我将补充一些。假设此表中的列为Field_ID、table_Field和Field,假设您的表如下所示:
正如我前面提到的,现在您的查询将尝试回拉字段为fullname、confirmed或location\u short all的行。而不是试图填充一行中的一列。有4个结果,让我们将查询更改为返回4行
询问
会发生什么
此查询现在将拉回看起来更像这样的数据:
然而,我想你会对你最终得到的结果感到惊讶。由于查询不会将API_Objects_字段中的数据与任何其他表连接,因此您将一次又一次地从上面的结果表中获取值。事实上,您将获得由返回的每一行的上述值
Select *
From user_basics u
INNER JOIN Pod_Membership PM ON U.UserID = PM.UserID
WHERE PM.PodID = 164
如果这个查询返回12个结果,您将得到12个Alan Turings、12个Catherine Zeta Jones、12个Trues和12个MNs。如果这不是您要查找的结果,您将需要在内部联接中添加一个ON部分,以便f的结果与其他表连接。选择COALESCETable_字段,字段作为API_对象_字段中的字段,其中字段在“全名”中,“确认”中,“primary_email”和“location_short”应仅返回1个结果,因此,请细化where子句以返回唯一的记录。@akfkmupiwu请参阅上面发布的问题答案。如果API_Objects_字段中存在userid,并且它是unique@akfkmupiwu对于你在评论部分发布的相关问题,我在回答部分给出了解决方案,我想看看你在说什么,这是正确的表应该有关系,然后子查询将工作,那么您在comment section@akfkmupiwu中发布的查询呢?这将为所有记录提供相同的字段名。我确信这不是他的要求,因此他可以按照@Oğuz Sezer的建议,改进where子句以返回distinct或user JOIN
SELECT f.Table_Field, Field
FROM user_basics U
INNER JOIN Pod_Membership PM ON U.UserID = PM.UserID
INNER JOIN (
SELECT Table_Field, Field
FROM API_Objects_Fields
WHERE Field IN (
'fullname'
,'confirmed'
,'primary_email'
,'location_short'
)
) f
WHERE PM.PodID = 164
ORDER BY U.Ctime DESC
Table_Field | Fields
Alan Turing | fullname
Catherine Zeta Jones | fullname
True | confirmed
MN | location_short
Select *
From user_basics u
INNER JOIN Pod_Membership PM ON U.UserID = PM.UserID
WHERE PM.PodID = 164