【发布时间】:2015-05-28 16:51:39
【问题描述】:
我正在尝试将一个表中的行插入到另一个表中,而这些行不在我要移动到的表中。我也只想移动那些具有最高日期戳的。 (我只想插入不在 tb1 中且具有最大时间戳的行)
这是我目前所拥有的:
INSERT INTO [db].[dbo].[tb1]
SELECT *
FROM tb2
WHERE ( dbo.tb2.STime = (SELECT Max(STime)
FROM dbo.tb2) )
AND ( EMPNO NOT IN (SELECT EMPNO
FROM [db].[dbo].[tb1]) );
执行时出现此错误:
Msg 147, Level 15, State 1, Line 43 聚合可能不会出现在 WHERE 子句,除非它位于 HAVING 子句中包含的子查询中 或选择列表,并且正在聚合的列是外部 参考。
-编辑 已解决
WITH aggregateTime (maxTime) AS (
SELECT MAX(STime) AS maxTime
FROM tb2
)
INSERT INTO db.dbo.tb1
SELECT *
FROM tb2
INNER JOIN aggregateTime ON 1=1
WHERE tb2.STime = aggregateTime.maxTime AND EMPNO NOT IN (SELECT EMPNO FROM tb1);
【问题讨论】:
-
有什么办法吗?
-
添加限定符会有帮助吗?
INSERT INTO db.dbo.tb1 t1a SELECT * FROM tb2 t2a WHERE t2a.STime = (SELECT MAX(t2b.STime) FROM dbo.tb2 t2b) AND t2a.EMPNO NOT IN (SELECT t1b.EMPNO FROM db.dbo.tb1 t1b) -
我仍然遇到同样的错误。
标签: sql-server tsql sql-server-2012 max sql-insert