【问题标题】:Compare two tables for a matching value from the respective columns and identify records missing比较两个表中相应列的匹配值并识别缺失的记录
【发布时间】:2019-11-06 10:40:08
【问题描述】:

我有两个表格和数据,如下所示:

我想比较两个表的列“Type 和 MatchType”,并确定 MatchType 中缺少 Type 的第一个表的 Id。如果我们可以使用连接,“类型”和“匹配类型”是两个表中唯一的公共列。例如,第二行的 FirstTable 列值匹配 SecondTable 的第二行,比较应该像 FirstTable 总是有数字,而第二个表在相同的数字之前有 2 个字符,所以我们应该忽略这些字符并只检查数字,如果两者都有匹配,然后忽略第一个表中的 ID。在下面的示例数据中,我的输出应该有来自 FirstTable 的 Id 1 和 3,因为这两个记录的“类型”都是 NULL 或在 SecondTable 中不存在。

CREATE TABLE [dbo].[FirstTable](
    [Id] [int] NOT NULL,
    [Name] [varchar](50) NULL,
    [Type] [varchar](50) NULL
)

CREATE TABLE [dbo].[SecondTable](
    [ID] [int] NULL,
    [Relation] [varchar](50) NULL,
    [MatchType] [nvarchar](50) NULL
)

Id  Name    Type
1   Bam     1234
2   Prish   3433
3   Tomato  4545


ID  Relation    MatchType
1   Sister     NULL
2   Mother     PS3433
3   Nomad      NULL
4   Nothing    PS4322

预期结果

Ids(来自第一个表,因为 SecondTable 的 MatchType 中不存在相应 ID 的类型 - 请记住删除第二个表 MatchType 值中前面的 2 个字符并仅比较数字)

1
3

我尝试使用PATINDEX,但它似乎不起作用或者我做错了什么。

【问题讨论】:

    标签: sql sql-server join sql-server-2016 sqlcommand


    【解决方案1】:

    试试这个

    SELECT F.* 
    FROM FirstTable F LEFT JOIN (SELECT RIGHT(MatchType,LEN(MatchType)-2) MT FROM SecondTable) S ON F.Type = S.MT  
    WHERE S.MT IS NULL
    

    FIDDLE DEMO

    【讨论】:

    • 抱歉,如果您以后有时间再问一个愚蠢的问题。如何使您减去的数字 2 作为通用数字。比方说,如果我有 3 或 4 个字符等,我只选择数字。我认为我们可以使用 patindex[0-9] 但我无法正确地构建它。
    • @Learner 如果您不确定字符串长度,请选择PATINDEX,如此处提到的SELECT MatchType,SUBSTRING(MatchType, PATINDEX('%[0-9]%', MatchType), PATINDEX('%[0-9][^0-9]%', MatchType + 't') - PATINDEX('%[0-9]%', MatchType) + 1) AS Number FROM SecondTable。你也可以在这里看到DEMO
    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 2010-10-14
    • 1970-01-01
    • 2017-08-28
    相关资源
    最近更新 更多