Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这个SQL子查询语句不起作用?_Sql_Sql Server - Fatal编程技术网

为什么这个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