Вы можете использовать приведенный ниже запрос на выборку для требования
DECLARE @t TABLE (Data VARCHAR(50))
INSERT INTO @t SELECT 'A,B,C' UNION ALL SELECT 'I,J,K' UNION ALL SELECT 'A,D'
SELECT DISTINCT b.Item AS Child,
CASE WHEN
CHARINDEX(b.Item,a.Data)=1
THEN null
ELSE SUBSTRING(a.data, 1,CHARINDEX(',',a.data)-1) END AS Parent FROM @t a CROSS APPLY dbo.split(a.Data,',') b
. Для этого вам нужна пользовательская функция Split, которая возвращает табличную переменную
CREATE FUNCTION [dbo].[Split]
(
@ItemList VARCHAR(4000),
@delimiter VARCHAR(10)
)
RETURNS @IDTable TABLE (ID INT IDENTITY(1,1),Item VARCHAR(500))
AS
BEGIN
-- This function is used to split up multi-value parameters
DECLARE @tempItemList NVARCHAR(4000)
SET @tempItemList = @ItemList
DECLARE @i INT
DECLARE @Item NVARCHAR(4000)
SET @tempItemList = REPLACE (@tempItemList, ' ' + @delimiter, @delimiter)
SET @tempItemList = REPLACE (@tempItemList, @delimiter + ' ', @delimiter)
SET @i = CHARINDEX(@delimiter, @tempItemList)
WHILE (LEN(@tempItemList) > 0)
BEGIN
IF @i = 0
SET @Item = @tempItemList
ELSE
SET @Item = LEFT(@tempItemList, @i -1)
INSERT INTO @IDTable(Item) VALUES(@Item)
IF @i = 0
SET @tempItemList = ''
ELSE
SET @tempItemList = RIGHT(@tempItemList, LEN(@tempItemList) - (@i + LEN(@delimiter)-1))
SET @i = CHARINDEX(@delimiter, @tempItemList)
END
RETURN
END
Я бы скорее предложил изменить требуемую структуру таблицы, если это возможно, с учетом производительности.
Надеюсь, это полезно.