我以“富文本模式”创建了这个问题,因此可能需要在其中查看以获得表格的正确布局。
我有两张桌子。
表1
用户身份 | 票号 | 病例编号 | 地位 |
---|---|---|---|
1 | INC1234567 | 无效的 | 无效的 |
2 | WS12345678 | 无效的 | 无效的 |
3 | HIG1234567 | 无效的 | 无效的 |
表2
用户身份 | INC | ABC | WS | 高血压 | 病例编号 | 地位 |
---|---|---|---|---|---|---|
1 | 是的 | 是的 | 无效的 | 无效的 | 案例123 | 例外 |
2 | 无效的 | 是的 | 是的 | 是的 | 案例981 | 的确 |
3 | 无效的 | 是的 | 无效的 | 无效的 | 案例871 | 未授予 |
我想根据 Table2.CaseID、Table2.Status 中的值更新 Table1.CaseID、Table1.Status 列。只需在两个表之间连接 UserID 即可完成此操作,这并不难。
对我来说困难的是,只有在满足某些条件时我们才会更新 Table1 的列。
用户 ID 匹配(给定)
Table1.TicketNumber 的字母部分在 Table2 的相应列中为“Yes”。因此,以 UserID = 1 为例,我们将更新 Table.CaseID = 'Case123" 和 Status = 'Exception',因为 UserID 匹配,并且在 Table2.INC = 'Yes' 下。我们将更新 Table1.CaseID = 'Case981' 和 Status = 'Granted',因为 UserID 匹配,并且 Table1.TicketNumber 的字母字符 = 'WS' 和 Table2.WS = 'Yes'。我们不会更新 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 中的各个列进行比较。我的第一个想法是使用 Cursor,但我认为这会非常低效。我的下一个想法是为 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 中的游标来执行此操作,但我认为应该有一种方法可以使用单个 Update 语句和一些 Case 语句来实现这一点,除非我使用函数,否则我对这部分一无所知。
如何使用
LIKE
运算符来匹配前缀,如下所示:该
LIKE
运算符允许您仅匹配票号前缀。该[0-9]
部分确保匹配的前缀后面紧跟着一个数字,这样前缀'WS'
就不会被错误地匹配到'WSX123'
票号。也许更清晰的变化是将匹配条件移至
ON
条件。这与应用于内连接时功能相同。这只是一个风格和可读性的问题。
结果:
附注:确保将链或
OR
条件括在括号中,以确保预期的运算符评估顺序。在原始代码中,A.CaseID IS NULL AND A.Status IS NULL
条件只会针对INC
案例执行,而不会针对其他ABC
案例WS
执行。(从技术上讲,条件周围的括号AND
是不必要的,但在处理复杂的嵌套逻辑表达式时,有时括号越多越好。)请参阅此 db<>fiddle了解演示。