在SQL中使用交叉应用时查找两个表之间的匹配值

在SQL中使用交叉应用时查找两个表之间的匹配值,sql,sql-server,join,case,patindex,Sql,Sql Server,Join,Case,Patindex,我试图从表A列x中提取5个或更多连续数字,并将提取的数字与表B列z相匹配。如果该值存在,则可以,但如果该值不存在,则需要将其插入表B中。我已设法从表A中提取数字,但在尝试加入时,我被卡住了,因为我使用了交叉应用和大小写。也许我只是不明白该怎么做 我用来提取数字的代码: SELECT nvt.AdditionalInformation, CASE WHEN M.FirstMatch > 0 THEN SUBSTRING(Additio

我试图从表A列x中提取5个或更多连续数字,并将提取的数字与表B列z相匹配。如果该值存在,则可以,但如果该值不存在,则需要将其插入表B中。我已设法从表A中提取数字,但在尝试加入时,我被卡住了,因为我使用了交叉应用和大小写。也许我只是不明白该怎么做

我用来提取数字的代码:

SELECT nvt.AdditionalInformation,
       CASE
           WHEN M.FirstMatch > 0
           THEN SUBSTRING(AdditionalInformation, M.FirstMatch-1, N.SecondMatch-1)
          
           --check IF TPNumber EXISTS in ChangeRequests table then add ChangeRequest Id to ReportVersionChangeRequests table
           ELSE NULL
       END
FROM
(
    SELECT ':'+nvt.AdditionalInformation+':' AdditionalInformation
    FROM dbo.NSReportVtest nvt
) nvt

CROSS APPLY(VALUES(PATINDEX('%[0-9][0-9][0-9][0-9][0-9]%', ':'+nvt.AdditionalInformation+':'))) M(FirstMatch)
CROSS APPLY(VALUES(PATINDEX('%[^0-9]%', SUBSTRING(AdditionalInformation, M.FirstMatch-1, LEN(AdditionalInformation))))) N(SecondMatch)
目前,这是代码的结果:

表A:

附加信息 没有列名 :测试结果: 无效的 :测试结果: 256985 :测试结果: 无效的 :测试结果: 无效的 :测试结果: 无效的 :测试结果: 85965
我找到了一个有效的解决方案。我插入到一个临时表中,然后我可以选择特定的列,并将其连接到第二个表中,这样可以更容易地管理数据

SELECT nv.AdditionalInformation, 
       nv.Id,
       CASE
           WHEN M.FirstMatch > 0
           THEN SUBSTRING(AdditionalInformation, M.FirstMatch-1, N.SecondMatch-1)
           ELSE NULL
       END AS ExtractedTP
INTO #temp
FROM
(
    SELECT ':'+nv.AdditionalInformation+':' AdditionalInformation, 
           nv.Id
    FROM dbo.NSReportVtest nv
) nv
CROSS APPLY(VALUES(PATINDEX('%[0-9][0-9][0-9][0-9][0-9]%', ':'+nv.AdditionalInformation+':'))) M(FirstMatch)
CROSS APPLY(VALUES(PATINDEX('%[^0-9]%', SUBSTRING(AdditionalInformation, M.FirstMatch-1, LEN(AdditionalInformation))))) N(SecondMatch);

--select and join temp table to ChangeRequests table to see which TP Numbers exist

SELECT t.Id, 
       t.ExtractedTP, 
       nrt.TPNumber, 
       nrt.Id
FROM #temp t
     LEFT JOIN dbo.NSChangeRequestsTest nrt ON t.ExtractedTP = nrt.TPNumber
ORDER BY t.ExtractedTP DESC;

我找到了一个有效的解决方案。我插入到一个临时表中,然后我可以选择特定的列,并将其连接到第二个表中,这样可以更容易地管理数据

SELECT nv.AdditionalInformation, 
       nv.Id,
       CASE
           WHEN M.FirstMatch > 0
           THEN SUBSTRING(AdditionalInformation, M.FirstMatch-1, N.SecondMatch-1)
           ELSE NULL
       END AS ExtractedTP
INTO #temp
FROM
(
    SELECT ':'+nv.AdditionalInformation+':' AdditionalInformation, 
           nv.Id
    FROM dbo.NSReportVtest nv
) nv
CROSS APPLY(VALUES(PATINDEX('%[0-9][0-9][0-9][0-9][0-9]%', ':'+nv.AdditionalInformation+':'))) M(FirstMatch)
CROSS APPLY(VALUES(PATINDEX('%[^0-9]%', SUBSTRING(AdditionalInformation, M.FirstMatch-1, LEN(AdditionalInformation))))) N(SecondMatch);

--select and join temp table to ChangeRequests table to see which TP Numbers exist

SELECT t.Id, 
       t.ExtractedTP, 
       nrt.TPNumber, 
       nrt.Id
FROM #temp t
     LEFT JOIN dbo.NSChangeRequestsTest nrt ON t.ExtractedTP = nrt.TPNumber
ORDER BY t.ExtractedTP DESC;

我迷路了。查询返回一个结果集。您想要多个结果集吗?是否要修改表b?是否要在新结果集中显示结果?身份证是如何计算的?抱歉有点混乱。我需要一个结果集。id列是自动生成的。我需要表A和表B基本上合并到表C中。提供的代码当前生成结果集表A。那么为什么ID会改变呢?为什么不直接使用b的ID呢?把SELECT放在第三个APPLY中,并将其放到一旁:否则NULL在某种情况下是不必要的,尽管它确实使它变得有点清晰。I’m lost。查询返回一个结果集。您想要多个结果集吗?是否要修改表b?是否要在新结果集中显示结果?身份证是如何计算的?抱歉有点混乱。我需要一个结果集。id列是自动生成的。我需要表A和表B基本上合并到表C中。提供的代码当前生成结果集表A。那么为什么ID会改变呢?为什么不直接使用b的id呢?把SELECT放在第三个APPLY和join放在一边:否则NULL在某种情况下是不必要的,尽管它确实让它更清晰一些