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

Posted

技术标签:

【中文标题】不使用EXISTS引入子查询时,选择列表中只能指定一个表达式--sql中的错误【英文标题】:Only one expression can be specified in the select list when the subquery is not introduced with EXISTS -- error in sql 【发布时间】:2015-12-17 17:05:07 【问题描述】:
;WITH cte AS
(
    SELECT 
        Account_id, A_date, amount
    FROM 
        table1
    WHERE
        A_date IN (SELECT MAX(A_date), Account_id 
                   FROM table1 
                   WHERE Account_id IN (3,4,8,9) 
                   GROUP BY id)
        AND Account_id IN (3,4,8,9)

    UNION ALL

    SELECT 
        CAST(DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH, 0, A_date)+2, 0)) AS DATE),
        Account_id, amount
    FROM 
        cte
    WHERE
        Account_id IN (3,4,8,9)
        AND DATEADD(DAY,-1,DATEADD(MONTH,DATEDIFF(MONTH, 0, GETDATE()) + 1, 0))
)
INSERT INTO table1
    SELECT * 
    FROM cte
    WHERE NOT EXISTS (SELECT * 
                      FROM table1 AS t1 
                      WHERE t1.Account_id = cte.Account_id 
                        AND t1.A_date = cte.A_date)
    ORDER BY Account_id, A_date DESC

当我运行此查询时,我收到以下错误

选择列表中只能指定一个表达式,当 EXISTS 没有引入子查询

我认为是因为我在 where 子句的子查询中使用了多个 ID 号。谁能告诉我如何解决这个问题?

【问题讨论】:

【参考方案1】:

第一个子查询会产生这个错误信息:

SELECT Account_id, A_date, amount
FROM table1
WHERE A_date IN (SELECT MAX(A_date), Account_id
                 FROM table1
                 WHERE Account_id IN (3,4,8,9)
                 GROUP BY id
                ) AND
      Account_id IN (3,4,8,9);

表达此查询的正确方法是使用相关子查询:

SELECT Account_id, A_date, amount
FROM table1 t1 
WHERE A_date IN (SELECT MAX(A_date)
                 FROM table1 t1a
                 WHERE t1a.Account_id = t1.Account_id
                ) AND
      Account_id IN (3,4,8,9);

注意group by 子句没有在子查询中使用(select 只有一列)。

我不确定group by id 应该做什么。但它也会产生错误,因为id 不在表中,或者因为account_idselect 中。

编写查询的更简单方法是使用窗口函数:

SELECT Account_id, A_date, amount
FROM (SELECT t1.*, MAX(a_date) OVER (PARTITION BY Account_id) as as maxad
      FROM table1 t1 
     ) t1
WHERE A_date = maxad

【讨论】:

我使用 group by 因为我需要与 id 关联的最新日期。 第一种方法奏效了。非常感谢您的帮助。【参考方案2】:

只需将您的最后一个插入查询替换为:

INSERT INTO table1
SELECT c.* FROM cte c, table1 t1
WHERE t1.Account_id <> cte.Account_id AND t1.A_date <> cte.A_date
ORDER BY Account_id, A_date DESC

【讨论】:

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

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

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

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

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

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

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