为什么这个SQL子查询语句不起作用?

时间:2014-07-10 10:11:09

标签: sql sql-server

该语句产生以下错误。

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

我认为我需要在子查询中连接字段名称?

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

子查询指定要从表中返回的字段。

3 个答案:

答案 0 :(得分:0)

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 

这是一个基于您的问题的假设查询

答案 1 :(得分:0)

    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需要这样做

答案 2 :(得分:0)

错误告诉您

您的查询问题正是错误所说的,它带来了多个结果。由于子查询位于外部查询的选择部分(而不是from或where),因此sql正在查找填充特定列的一个值。在填写excel电子表格方面更多地考虑它。您不能向一个单元格添加两个单独的值。相反,您需要将数据分成两行。

另一方面,合并检查第一个值是否为null,如果是,则返回第二个值。如果第一个值不为null,则返回该值。听起来,这不是你正在寻找的行为。

如何解决此问题

您需要更改查询以针对Fields可能的每个可能值拉回不同的行,或者您需要找到一种方法来仅为Fields指定一个值。由于我不确定你在寻找什么,我将展示解决这个问题的第一种方法。

数据

您的问题没有提供API_Objects_Fields的任何数据,所以我要做一些。我们假设此表中的列为Field_IDTable_FieldField,让我们假设您的表格如下:

 Field_ID | Table_Field           | Field
  1       |  Alan Turing          |  fullname
  2       |  Catherine Zeta Jones |  fullname
  3       |  True                 |  confirmed
  4       |  MN                   |  location_short
  5       |  123-456-7890         |  phone_number

正如我之前提到的,现在您的查询将尝试撤回字段为fullname,confirm或location_short all的行。而不是试图填充一行的一列。完整的4个结果,让我们改变你的查询以带回4行

查询

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

但是,我认为您最终会对结果感到惊讶。由于查询未将API_Objects_Fields中的数据与任何其他表连接,因此您将反复从上面的结果表中获取值。实际上,您将获得

返回的每一行的上述值
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个MN。如果这不是您要查找的结果,则需要在内部联接中添加ON部分,以便f的结果与其他表格相关联。