如何合成连接表的属性

Tob*_*obi 17 sql t-sql sql-server

我有一个像这样定义的视图:

CREATE VIEW [dbo].[PossiblyMatchingContracts] AS
SELECT 
    C.UniqueID,
    CC.UniqueID AS PossiblyMatchingContracts
FROM  [dbo].AllContracts AS C
    INNER JOIN [dbo].AllContracts AS CC
        ON C.SecondaryMatchCodeFB = CC.SecondaryMatchCodeFB
            OR C.SecondaryMatchCodeLB = CC.SecondaryMatchCodeLB
            OR C.SecondaryMatchCodeBB = CC.SecondaryMatchCodeBB
            OR C.SecondaryMatchCodeLB = CC.SecondaryMatchCodeBB
            OR C.SecondaryMatchCodeBB = CC.SecondaryMatchCodeLB
WHERE C.UniqueID NOT IN
    (
        SELECT UniqueID FROM [dbo].DefinitiveMatches
    )
    AND C.AssociatedUser IS NULL
    AND C.UniqueID <> CC.UniqueID
Run Code Online (Sandbox Code Playgroud)

这基本上是找到第一个名字和生日匹配的合同.这非常有效.现在我想为每一行添加一个合成属性,其中只有一个源行的值.

让我举个例子来说明一点.假设我有下表:

UniqueID  | FirstName | LastName  | Birthday

1         | Peter     | Smith     | 1980-11-04
2         | Peter     | Gray      | 1980-11-04
3         | Peter     | Gray-Smith| 1980-11-04
4         | Frank     | May       | 1985-06-09
5         | Frank-Paul| May       | 1985-06-09
6         | Gina      | Ericson   | 1950-11-04
Run Code Online (Sandbox Code Playgroud)

生成的视图应如下所示:

UniqueID | PossiblyMatchingContracts | SyntheticID

1        | 2                         | PeterSmith1980-11-04
1        | 3                         | PeterSmith1980-11-04
2        | 1                         | PeterSmith1980-11-04
2        | 3                         | PeterSmith1980-11-04
3        | 1                         | PeterSmith1980-11-04
3        | 2                         | PeterSmith1980-11-04
4        | 5                         | FrankMay1985-06-09
5        | 4                         | FrankMay1985-06-09
6        | NULL                      | NULL [or] GinaEricson1950-11-04
Run Code Online (Sandbox Code Playgroud)

请注意,SyntheticID列仅使用来自其中一个匹配源行的值.哪一个没关系.我将此视图导出到另一个应用程序,然后需要能够识别每个"匹配组".

我的意思是明确的吗?任何想法如何在sql中完成?

也许有助于详细说明实际用例:

我正在从不同系统导入合同.为了解释拼写错误的可能性或已结婚的人但姓氏只在一个系统中更新,我需要找到所谓的"可能的匹配".如果两个或多个合同包含相同的生日加上相同的第一个,最后一个或出生名称,则认为它们可能匹配.这意味着,如果合同A与合同B匹配,则合同B也与合同A匹配.

目标系统使用多值引用属性来存储这些关系.最终目标是为这些合同创建用户对象.首先要注意的是,对于多个匹配的合同,它应该只是一个用户对象.因此我在视图中创建这些匹配项.第二个问题是,用户对象的创建由工作流发生,工作流为每个合同并行运行.为了避免为匹配的合同创建多个用户对象,每个工作流需要检查是否已经存在匹配的用户对象或另一个工作流,即将创建所述用户对象.因为与sql相比,工作流引擎非常慢,所以工作流不应重复整个匹配测试.因此,我们的想法是让工作流程仅检查'syntheticID'.

Pet*_*ing 0

你可以试试这个:

SELECT 
    C.UniqueID,
    CC.UniqueID AS PossiblyMatchingContracts,
    FIRST_VALUE(CC.FirstName+CC.LastName+CC.Birthday) 
          OVER (PARTITION BY C.UniqueID ORDER BY CC.UniqueID) as SyntheticID
FROM 
    [dbo].AllContracts AS C
INNER JOIN
    [dbo].AllContracts AS CC
ON
        C.SecondaryMatchCodeFB = CC.SecondaryMatchCodeFB
    OR
        C.SecondaryMatchCodeLB = CC.SecondaryMatchCodeLB
    OR
        C.SecondaryMatchCodeBB = CC.SecondaryMatchCodeBB
    OR
        C.SecondaryMatchCodeLB = CC.SecondaryMatchCodeBB
    OR
        C.SecondaryMatchCodeBB = CC.SecondaryMatchCodeLB
WHERE 
    C.UniqueID NOT IN
    (
        SELECT UniqueID FROM [dbo].DefinitiveMatches
    )
AND
    C.AssociatedUser IS NULL
Run Code Online (Sandbox Code Playgroud)

这将生成额外的一行(因为我们遗漏了 C.UniqueID <> CC.UniqueID),但会给您良好的 Souluton。