我在“富文本模式”中创建了问题,因此可能需要在其中查看以获得正确的表格布局。
我有两张桌子。
表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 列。
用户 ID 匹配(给定)
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 语句,并且我对这部分感到不知所措,除非我走以下路线功能。
怎么样:
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'
票号匹配。