2015-04-11 5 views
2

У меня есть две таблицы, Books и Authors.Замените значения разделенных точкой с запятой на другие значения таблицы

Таблица Books

ID  Title  Authors 
1  apple  1;2;3; 
2  cancer 1;5; 

Таблица Authors

ID  Name 
1  John 
2  Mike 
3  Joe 
4  Katy 
5  Sara 

Мне нужен запрос, который результатом является

ID  Title  Authors 
1  apple  John;Mike;Joe 
2  cancer John;Sara 
+2

Просто для исправления, это не запятая, они называются ** точкой с запятой ** –

+0

@RahulTripathi вы пишете, просто флб! ;) – Farid

+0

UPDATE YourTable SET Авторы = ЗАМЕНИТЬ (авторы '', ';') SQL Server Helper http://www.sql-server-helper.com/ –

ответ

2

Как насчет этого? Но вы должны убедиться, что столбец «Авторы» в таблице «Книги» всегда имеет действительные данные.

SELECT ID, 
     Title, 
     STUFF(CAST((SELECT ';' + aut.Name 
        FROM Authors aut 
        WHERE aut.ID IN 
         (SELECT CAST(Split.a.value('.','VARCHAR(max)') AS int) As bid 
          FROM 
          (SELECT CAST ('<M>' + REPLACE(LEFT(Authors, DATALENGTH(Authors)-1), ';', '</M><M>') + '</M>' AS XML) AS Data 
          ) AS A CROSS APPLY Data.nodes ('/M') AS Split(a)) 
         FOR XML PATH(''), TYPE))AS nvarchar(max)), 1,1,'') 
FROM Books 
+0

U спас мою жизнь человека !! Спасибо! – Farid

1

Один из способов сделать это разделить строки первыми в отдельные строки затем присоединиться, что в другую таблицу, а затем разобрать его вместе с одной и той же структурой.

Для разделения строки я рекомендую использовать DelimitedSplit8k Джефф Moden (http://www.sqlservercentral.com/articles/Tally+Table/72993/), и последнее, что должно выглядеть примерно так (не могу проверить это сейчас, но, надеюсь, это нормально):

select b.id, b.title, d.Item as c 
into #tmp 
from books b cross apply dbo.DelimitedSplit8K(b.authors, ';') as d 

select t2.id, t2.title, (SELECT STUFF(
      (SELECT ';' + a.name 
       FROM #tmp t1 
       join authors a on a.id = t1.c 
       where t1.id = t2.id 
       FOR XML PATH ('')) 
      , 1, 1, '')) as Name 
from (
    select distinct id, title from #tmp 
) t2 
+0

работает для книг с 1 автором, но не для нескольких авторов. кстати, спасибо за ваше время – Farid

+0

Это должно сработать, но поскольку я не мог его протестировать, скорее всего, там где-то есть ошибка или два :). #tmp должен содержать одну строку на автора, каждый из авторов находится в c-столбце, а select должен анализировать его вместе. –

+0

В синтаксисе select вместо запятой была запятая вместо синтаксического анализа данных, но ничего не видно. –

Смежные вопросы