两个表之间的更新

问题描述 投票:0回答:1

我在“富文本模式”中创建了问题,因此可能需要在其中查看以获得正确的表格布局。

我有两张桌子。

表1

用户ID 票号 案例编号 状态
1 INC1234567
2 WS12345678
3 HIG1234567

表2

用户ID 公司 ABC WS 案例编号 状态
1 是的 是的 案例123 异常
2 是的 是的 是的 案例981 授予
3 是的 案例871 未获准

我想根据 Table2.CaseID、Table2.Status 中的值更新 Table1.CaseID、Table1.Status 列。 只需连接两个表之间的 UserID 即可完成此操作,这并不是太困难。

对我来说困难的是,我们仅在满足某些条件时更新 Table1 列。

  1. 用户 ID 匹配(给定)

  2. Table1.TicketNumber 的 alpha 部分在 Table2 的相应列中具有“Yes”。 因此,以 UserID = 1 为例,我们将更新 Table.CaseID = 'Case123" 和 Status = 'Exception',因为 UserID 匹配,并且在 Table2.INC = 'Yes' 下。我们将更新 Table1.CaseID = 'Case981'状态 =“已授予”,因为 UserID 匹配,并且 Table1.TicketNumber 的字母字符 =“WS”且 Table2.WS =“是”。我们不会更新 Table1.UserID = 3 的任何列,因为 Table1.TicketNumber 字母字符 =“HIG”。 ',并且 Table2.HIG 具有 NULL 值。

我能够得到基本的更新声明:

UPDATE 
    A
SET
    A.CaseID = B.CaseID, 
    A.Status = B.Status
FROM 
    Table1 A
    INNER JOIN Table2 B ON A.UserID = B.UserID
WHERE
    A.CaseID IS NULL
    AND A.Status = 'New'

正是第二部分给我带来了很多麻烦,将 Table1.TicketNumber 与 Table2 中的各个列进行比较。 我的第一个想法是使用游标,但我认为这效率非常低。 我的下一个想法是为 TicketNumber 的每个“类型”创建一个函数,并传入 TicketNumber,但我从未在 T-SQL 中使用过函数,不确定这是否可行。 像这样的东西:

UPDATE 
    A
SET
    A.CaseID = B.CaseID, 
    A.Status = B.Status
FROM 
    Table1 A
    INNER JOIN Table2 B ON A.UserID = B.UserID
WHERE
    A.CaseID IS NULL
    AND A.Status IS NULL
        AND 
            (dbo.IsTicketINC(A.TicketNumber) = 'Y' AND B.INC = 'Yes')
            OR (dbo.IsTicketABC(A.TicketNumber) = 'Y' AND B.ABC = 'Yes')
            OR dbo.IsTicketWS(A.TicketNumber) = 'Y' AND B.WS = 'Yes')
            OR ........

我不确定这是否有效并且有效,但这是我的另一个想法。 我知道我可以使用 T-SQL 中的游标来完成此操作,但我认为应该有一种方法可以使用单个更新语句来完成此操作,使用一些 Case 语句,并且我对这部分感到不知所措,除非我走以下路线功能。

t-sql sql-update
1个回答
0
投票

怎么样:

WHERE
    A.CaseID IS NULL
    AND A.Status IS NULL
    AND (
       (B.INC = 'Yes' AND A.TicketNumber LIKE 'INC[0-9]%')
       OR (B.ABC = 'Yes' AND A.TicketNumber LIKE 'ABC[0-9]%')
       OR ...
    )

LIKE
运算符允许您仅匹配票号前缀。
[0-9]
部分确保匹配的前缀后面紧跟一个数字,这样
'WS'
前缀就不会错误地与
'WSX123'
票号匹配。

© www.soinside.com 2019 - 2024. All rights reserved.