【问题标题】:T-SQL Insert when not in table and when max timestamp Issue不在表中和最大时间戳问题时插入 T-SQL
【发布时间】: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


【解决方案1】:

您可以使用只有一列的 CTE,即来自 tb2 的最大时间。然后加入 CTE 并在检查它是否为最大值时引用它。

WITH aggregateTime (maxTime) AS (
    SELECT MAX(STime) AS maxTime 
    FROM tb2
)
INSERT INTO tb1 (id, EMPNO, Street1)
SELECT id, EMPNO, Street1
FROM tb2 
INNER JOIN aggregateTime ON 1=1
WHERE tb2.STime = aggregateTime.maxTime AND EMPNO NOT IN (SELECT EMPNO FROM tb1);

工作 SQL 小提琴:http://sqlfiddle.com/#!6/141bf/4

【讨论】:

  • 由于某种原因,编辑服务调用返回 500 错误响应
  • 我收到“WHERE 附近的语法不正确”错误。不知道为什么
  • 我有 aggregate.maxTime 而不是 aggregateTime.maxTime。我解决了,你可以再试一次吗?
  • 错误仍然存​​在。我在 INNER JOIN 聚合时间前面也有这个错误。 "在预期条件的上下文中指定的非布尔类型的表达式"
  • 我更新了查询并制作了一个 SQLFIddle 示例,表明它可以正常工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 2012-09-13
  • 1970-01-01
  • 1970-01-01
  • 2017-01-21
相关资源
最近更新 更多