【问题标题】:T-SQL Merge Returning Multiple ResultsT-SQL 合并返回多个结果
【发布时间】:2016-02-07 15:57:38
【问题描述】:

我有两个数据库正在合并到一个数据库中。现在它们在一个数据库中,我可以链接它们并使用引用来提高性能,但是首先我需要从一个表中查找 ID,并将其插入到另一个表中,因为目前没有外键。

表结构如下:

瞄准:注册、FrameDeliveryDate、RegistrationID

注册:ID、RegistrationNo、DeliveryDate

目前使用注册和交付日期的组合来识别记录。

我试过以下说法:

MERGE INTO Sightings
USING Registrations
  ON Sightings.Registration = Registrations.RegistrationNo AND Sightings.FrameDeliveryDate = Registrations.DeliveryDate 
WHEN MATCHED THEN
UPDATE 
  SET RegistrationID = Registrations.ID;

不幸的是,这会失败,因为有时组合会返回多个记录。在这种情况下,我宁愿忽略链接它们,尽管选择第一条记录也是可以接受的。

如何做到这一点?

【问题讨论】:

  • 由于没有任何候选键,您的目击表显然是非关系型的。为什么你认为关系工具能够解决这个 ISAM 问题?每个表上都有一个候选键的必要性,即第一范式的实现,是关系工具包正常工作的先决条件。
  • 列的数量比我在上面发布的要多,但由于它们在这里不相关,所以为了简单起见,我省略了它们。其中之一是 ID 列。
  • 如果可能,添加示例数据和预期结果
  • 候选键和外键列总是相关,因为它们定义了数据的含义。省略不相关的属性列很好。
  • 我认为您混淆了您的术语。 Sightings (ID) 上的候选键未在此处列出,因为它无关紧要。然而,我确实错过了描述中的外键,为了清楚起见,我现在添加了它,尽管它仍然列在提供的 SQL 语句中。不管怎样,你的评论太挑衅了,我建议你以后把你的语言调低一点。

标签: sql-server tsql merge


【解决方案1】:

要忽略这些具有多个匹配项的组合并因此产生不明确的值,您可以使用派生表或 CTE。

WITH CTE1 AS
(
SELECT *,
       COUNT(*) OVER (PARTITION BY RegistrationNo, DeliveryDate) AS Cnt
FROM Registrations
), CTE2 AS
(
SELECT *
FROM CTE1
WHERE Cnt = 1
)
    MERGE INTO Sightings
    USING CTE2 Registrations
      ON Sightings.Registration = Registrations.RegistrationNo AND Sightings.FrameDeliveryDate = Registrations.DeliveryDate 
    WHEN MATCHED THEN
    UPDATE 
      SET RegistrationID = Registrations.ID;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 2017-08-31
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 2021-07-30
    相关资源
    最近更新 更多