【问题标题】:Filter the values from the source in merge query in mssql在 mssql 的合并查询中过滤源中的值
【发布时间】:2018-12-11 09:11:16
【问题描述】:

当我使用合并查询插入时,我有 tableAKey1,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 ', 'ma​​x datetime value') 从所有值中提取而不使用中间表?

预期结果仅插入/更新 datakeyB1datakeyA1 值。如果两个数据中的日期相同,则只获取一行。

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


【解决方案1】:

您可以使用 top 1 with tiesorder by row_number...values 子句与 select 语句包装在一起 - 像这样:

MERGE tableA AS t
USING (
        SELECT TOP 1 WITH TIES *
        FROM
            (VALUES 
                ('datakeyA1', 'datetime value'), 
                ('datakeyB1', 'datetime value'),
                ('datakeyA1', 'max datetime value')
            ) AS s (Key1, datetime)
        ORDER BY ROW_NUMBER() OVER(PARTITION BY Key1 ORDER BY datetime DESC)
        ) s
        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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-27
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多