2014-10-30 5 views
0

В настоящее время я сталкиваюсь с проблемой, которая, вероятно, имеет простое решение, но почему-то я не могу ее найти.SQL Server: Заменить значения в поле, используя другую таблицу

У меня есть таблица А с двумя полями, которые отформатированы следующим образом:

[ID] [Codes] 
1  A;B 
2  D 
3  A;C 

и таблица B отформатирован следующим образом:

[ID] [Codes] 
A  Apple 
B  Orange 
C  Pear 
D  Strawberry 

То, что я хотел бы сделать, это Lookup/Заменить в чтобы произвести следующий вывод

a.[ID] a.[Parsed_Codes] 
    1  Apple;Orange 
    2  Strawberry 
    3  Apple;Pear 

Короче говоря, я хочу заменить коды в таблице A, с помощью значения, связанные с этими кодами в таблице B.

Конечно, я мог бы просто написать длинный оператор замены (в моем случае есть несколько 100 кодов), но это кажется крайне неэффективным методом.

Спасибо!

ответ

1

Простой способ заключается в преобразовании Таблицы A [коды] column data(csv) into separate rows. Затем присоединиться к таблице B, чтобы получить соответствующие коды. Наконец convert the rows to CSV, чтобы получить результат. Попробуй это.

CREATE TABLE #tablea 
    ([ID] INT,[Codes] VARCHAR(100)) 

INSERT INTO #tablea 
VALUES  (1,'A;B'),(2,'D'),(3,'A;C') 

CREATE TABLE #tableB 
    ([ID] VARCHAR(100),[Codes] VARCHAR(100)) 

INSERT INTO #tableb 
VALUES  ('A','Apple'),('B','Orange'), 
      ('C','Pear'),('D','Strawberry') 

SELECT a.id, 
     a.Codes old_code, 
     b.Codes Parsed_Codes 
INTO #final 
FROM #tableb b 
     JOIN (SELECT id, 
        codes, 
        Split.a.value('.', 'VARCHAR(100)') [new_Codes] 
      FROM (SELECT id, 
          [Codes], 
          Cast ('<M>' + Replace([Codes], ';', '</M><M>') 
            + '</M>' AS XML) AS Data 
        FROM #tablea) AS A 
        CROSS APPLY Data.nodes ('/M') AS Split(a)) a 
     ON a.new_Codes = b.id 

SELECT t1.ID, 
     old_code, 
     Stuff((SELECT '; ' + CONVERT(VARCHAR, Parsed_Codes) 
       FROM #final b 
       WHERE b.ID = t1.ID 
       FOR XML PATH('')), 1, 2, '') 
FROM #final t1 
GROUP BY t1.id, 
      old_code 

ВЫХОД

ID old_code Parsed_Codes 
-- -------- ------------ 
1 A;B   Apple; Orange 
2 D   Strawberry 
3 A;C   Apple; Pear 

(Примечание: температура таблицы можно избежать, чтобы избежать путаницы кода я использовал временную таблицу)

+0

спасибо Прадипа. Работайте как очарование! –

0

Сначала создайте эту функцию. Используется для разделения строки с разделителями на переменную таблицу. Затем мы сможем использовать эту функцию для определения кодов из другой таблицы и возврата их в виде одной строки с использованием функции STUFF.

CREATE FUNCTION [dbo].[fnSplitString] 
    (
    @string NVarchar(MAX) 
    ,@delimiter Char(1) = ',' 
    ) 
RETURNS @t TABLE (string NVarchar(MAX)) 
AS 
BEGIN 
    DECLARE @pos Int 
    DECLARE @piece Varchar(500) 

    IF RIGHT(RTRIM(@string), 1) <> @delimiter 
     SET @string = @string + @delimiter 

    SET @pos = PATINDEX('%' + @delimiter + '%', @string) 
    WHILE @pos <> 0 
     BEGIN 
     SET @piece = LEFT(@string, @pos - 1) 
     INSERT @t 
        SELECT @piece 

     SET @string = STUFF(@string, 1, @pos, '') 
     SET @pos = PATINDEX('%' + @delimiter + '%', @string) 
     END 

    RETURN 
END 

Затем запустите следующий запрос ...

DECLARE @result TABLE 
    (
    [ID] Int 
    ,[CommaDelimitedCodes] Varchar(500) 
    ) 
DECLARE @codes TABLE 
    (
    [ID] Varchar(500) 
    ,[FullNames] Varchar(500) 
    ) 
INSERT INTO @result 
     SELECT 1 
       ,'A;B' 
INSERT INTO @result 
     SELECT 2 
       ,'D' 
INSERT INTO @result 
     SELECT 3 
       ,'A;C' 

INSERT INTO @codes 
     SELECT 'A' 
       ,'Apple' 
INSERT INTO @codes 
     SELECT 'B' 
       ,'Orange' 
INSERT INTO @codes 
     SELECT 'C' 
       ,'Pear' 
INSERT INTO @codes 
     SELECT 'D' 
       ,'Strawberry' 

SELECT * 
     ,STUFF((
       SELECT ', ' + [FullNames] 
       FROM @codes t 
       WHERE id IN (SELECT * 
           FROM dbo.fnSplitString(r.[CommaDelimitedCodes], ';')) 
       FOR 
       XML PATH('') 
       ), 1, 2, '') AS taglist 
FROM  @result AS r 

Я создал две таблицы переменных для теста - но, очевидно, в вашем случае вы должны были бы заменить тех, с реальными именами полей в таблицах.