【发布时间】:2018-12-11 09:11:16
【问题描述】:
当我使用合并查询插入时,我有 tableA 和 Key1,datetime 列,我在源中获得了重复的行。 我们如何通过日期时间来归档查询中的源有最大值
MERGE tableA AS t
USING (VALUES
('datakeyA1', 'datetime value'),
('datakeyB1', 'datetime value'),
('datakeyA1', 'max datetime value')
) AS s (Key1, datetime)
ON s.Key1 = t.Key1
WHEN MATCHED THEN
UPDATE
SET Val = s.datetime
WHEN NOT MATCHED THEN
INSERT (Key1, datetime)
VALUES (s.Key1, s.datetime);
当运行上述查询时,我得到:
MERGE 语句尝试更新或删除同一行 不止一次。
有没有办法只查询这些行('datakeyB1', 'datetime value'),('datakeyA1 ', 'max datetime value') 从所有值中提取而不使用中间表?
预期结果仅插入/更新 datakeyB1、datakeyA1 值。如果两个数据中的日期相同,则只获取一行。
MERGE tableA AS t
USING (VALUES
('datakeyB1', 'datetime value'),
('datakeyA1', 'max datetime value')
) AS s (Key1, datetime)
ON s.Key1 = t.Key1
WHEN MATCHED THEN
UPDATE
SET Val = s.datetime
WHEN NOT MATCHED THEN
INSERT (Key1, datetime)
VALUES (s.Key1, s.datetime);
【问题讨论】:
-
你的钥匙不是钥匙?这就是为什么你更新不止一个......
-
在您的 using 语句中提供一些逻辑代码,而不是硬编码值。您可以只执行 row_number() over(按日期时间 desc 的键顺序分区)并选择等于 1 的行。然后您将获得不同的值,每个键只有 1 个。
-
我已经通过 php 代码生成了 using 语句中的值。我正在尝试多次插入。如果 Key1 已经存在,我必须更新该行的键
-
我可以看到。但是,如果您获得多个相同的密钥。然后你应该调整你的php代码。
-
是的,我也在尝试,同时我正在检查sql中是否有任何可能性。这可以更快地优化我的代码
标签: sql sql-server tsql azure-sql-database