我有一个表,每一行都有一个数字,我需要确定该数字是否位于另一个包含 ; 的表中的任何行中。分隔的数字。
我目前正在使用循环来遍历表,分别搜索每一行的列。正如你可以想象的那样,速度慢得令人痛苦。
我希望我能做这样的事情:
UPDATE [nbr_test] SET [found_flag] = 1 WHERE [nbr] IN ( SELECT [value] FROM STRING_SPLIT(( SELECT [numlist] FROM [findin] ),';') )
令人惊讶的是,SSMS 没有显示任何语法错误,但我收到错误“子查询返回超过 1 个值...”,这是有道理的,但有没有一种方法可以在不使用循环和永远执行的情况下执行类似的操作? 我正在使用 SQL Server 2019
这是一个例子:
CREATE TABLE [nbr_test] (
[id] int identity(1,1),
[nbr] varchar(50),
[found_flag] bit
)
CREATE TABLE [findin] (
[id] int identity(1,1),
[numlist] varchar(255)
)
INSERT INTO [nbr_test] VALUES
('12345',0),
('34567',0),
('56789',0)
INSERT INTO [findin] VALUES
('23456;67890'),
('98765;12345;01234'),
('06789'),
('56789')
这正是我想要的:
|id|nbr |found_flag|
|1 |12345|1 |
|2 |34567|0 |
|3 |56789|1 |
STRING_SPLIT()
只能产生一个结果,则它只能接受一个表达式(如 SELECT
语句)。一旦 findin
中有多于一行,情况就不再如此。您可以使用 CROSS APPLY
来生成 IN()
值:
UPDATE [nbr_test]
SET [found_flag] = 1
WHERE [nbr] IN
(
SELECT [value] FROM [findin]
CROSS APPLY STRING_SPLIT([numlist],';')
);