给定两个包含您提供的值的表(告诉我是否还有更多),您首先需要一种方法将 A.AR 中的值拆分为可管理的字符串。我使用这个用户定义函数:
CREATE FUNCTION [dbo].[UDF_StringDelimiter]
/*********************************************************
** Takes Parameter "LIST" and transforms it for use **
** to select individual values or ranges of values. **
** **
** EX: 'This,is,a,test' = 'This' 'Is' 'A' 'Test' **
*********************************************************/
(
@LIST VARCHAR(8000)
,@DELIMITER VARCHAR(255)
)
RETURNS @TABLE TABLE
(
[RowID] INT IDENTITY
,[Value] VARCHAR(255)
)
WITH SCHEMABINDING
AS
BEGIN
DECLARE
@LISTLENGTH AS SMALLINT
,@LISTCURSOR AS SMALLINT
,@VALUE AS VARCHAR(255)
;
SELECT
@LISTLENGTH = LEN(@LIST) - LEN(REPLACE(@LIST,@DELIMITER,'')) + 1
,@LISTCURSOR = 1
,@VALUE = ''
;
WHILE @LISTCURSOR <= @LISTLENGTH
BEGIN
INSERT INTO @TABLE (Value)
SELECT
CASE
WHEN @LISTCURSOR < @LISTLENGTH
THEN SUBSTRING(@LIST,1,PATINDEX('%' + @DELIMITER + '%',@LIST) - 1)
ELSE SUBSTRING(@LIST,1,LEN(@LIST))
END
;
SET @LIST = STUFF(@LIST,1,PATINDEX('%' + @DELIMITER + '%',@LIST),'')
;
SET @LISTCURSOR = @LISTCURSOR + 1
;
END
;
RETURN
;
END
;
然后,用那两张表:
DECLARE @TABLE TABLE (ID CHAR(1), AR VARCHAR(55));
INSERT INTO @TABLE VALUES ('A','N1 N3 N4');
INSERT INTO @TABLE VALUES ('B','N2');
INSERT INTO @TABLE VALUES ('C','N1');
INSERT INTO @TABLE VALUES ('D','N5');
INSERT INTO @TABLE VALUES ('E','N2 N1');
DECLARE @TABLE2 TABLE (RowID INT IDENTITY, ARID VARCHAR(55));
INSERT INTO @TABLE2 (ARID) VALUES ('N1');
使用CROSS APPLY 和LEFT JOIN,我得到了回复:
SELECT A.ID AS [A.ID], A.AR AS [A.AR],B.ARID AS [B.ARID]
FROM @TABLE A
CROSS APPLY dbo.UDF_StringDelimiter(A.AR,' ') X
INNER JOIN @TABLE2 B
ON B.ARID = X.Value
ORDER BY ID
;
返回:
A.ID A.AR B.ARID
-----------------------------------
A N1 N3 N4 N1
C N1 N1
E N2 N1 N1
当然你也可以把它分组,将它作为一个分隔列表返回,等等。给我更多的细节,也许我可以给你一个更好的回应。