一张表包含代表外科手术部分的代码。一个过程由一个或多个代码描述(每个代码一行)。可能会出现程序的组合。例如,一个操作可以由由一个代码表示的 1 个过程和由 3 个代码表示的第二个过程(该操作为 4 行)组成。
必须使用第二个表执行左连接,该表包含过程的代码,每一行中有一个或多个代码。
值得注意的是,用于描述基于总共三个代码的过程的特定代码也可能作为描述不同过程的单个代码出现,如表#Procedures 中的最后一个条目。因此,简单的连接并不能解决问题。
在当前的解决方案中,我在 SQL Server 2014 中使用两个嵌套的 while 语句,需要花费数小时。是否有更有效的方法来执行此任务,也许使用 SQL Server 的 xml 功能?
任何帮助表示赞赏。
示例:
CREATE TABLE #Procedures
(
ProcID INT,
NumberofCodes INT,
Codes NVARCHAR(20)
)
INSERT INTO #Procedures (ProcID, NumberofCodes, Codes)
VALUES (1, 1, 'SingleCodeXYZ'), (2, 3, 'TripleCodeXY1'), (2, 3, 'TripleCodeXY2'),
(2, 3, 'TripleCodeXY3'), (3, 2, 'DoubleCodeXY1'), (3, 2, 'DoubleCodeXY2'),
(4, 1, 'SingleCodeABC'), (5, 1, 'TripleCodeXY2')
CREATE TABLE #KodesforOperations
(
OPID INT,
ProcID INT,
NumberofCodes INT,
Codes NVARCHAR(20)
)
INSERT INTO #KodesforOperations (OPID, NumberofCodes, Codes)
VALUES (1, 4, 'SingleCodeXYZ'), (1, 4, 'TripleCodeXY1'), (1, 4, 'TripleCodeXY2'),
(1, 4, 'TripleCodeXY3'),
(2, 1, 'SingleCodeABC'),
(3, 2, 'DoubleCodeXY1'), (3, 2, 'DoubleCodeXY2')
--SELECT * FROM #Procedures
--SELECT * FROM #KodesforOperations
--nested While statements:
UPDATE A
SET A.ProcID = B.ProcID
FROM #KodesforOperations A
LEFT JOIN #Procedures B On A.Codes = B.Codes
WHERE A.NumberofCodes >= 3 AND B.NumberofCodes >= 3
UPDATE A
SET A.ProcID = B.ProcID
FROM #KodesforOperations A
LEFT JOIN #Procedures B On A.Codes = B.Codes
WHERE A.NumberofCodes >= 2 AND B.NumberofCodes >= 2
UPDATE A
SET A.ProcID = B.ProcID
FROM #KodesforOperations A
LEFT JOIN #Procedures B On A.Codes = B.Codes
WHERE A.NumberofCodes >= 1 AND B.NumberofCodes >= 1
SELECT * FROM #KodesforOperations
最佳答案
您应该能够组合这些条件。然而,这在逻辑上相当于只检查第三个:
UPDATE A
SET A.ProcID = B.ProcID
FROM #KodesforOperations A JOIN
#Procedures B
On A.Codes = B.Codes
WHERE A.NumberofCodes >= 1 AND B.NumberofCodes >= 1;
如果此条件为真,则与 2
和 3
的比较也为真。
LEFT JOIN
是不必要的,因为您需要两个表中的匹配项来测试 WHERE
条件。
关于sql - 基于 SQL Server 中两个表中的一到多行执行左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51539930/