不使用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_id
在select
中。
编写查询的更简单方法是使用窗口函数:
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 引入子查询时,选择列表中只能指定一个表达式