2016-04-05 10 views
0

Ben buSQL Server - CSV id karşı CSV değerleri

gibi CSV değeri olarak Table A ait Id geçirerek hangi 2 tablolar, ben ID ve Name sütunları
id name 
1 Turret Punch Press 
2 Laser Machine 
3 Press Brake 
4 Other machines 

ve Table B sahip olduğu TableA var
id TableACSV 
1 1,2 
2 1,3 

Benim sorgu

Select 
    id, TableACSV 
from tableB 
where (--here i am having problem with query--) 
gibi bir şey olacak

ben .. Bunu yapmak için kötü bir uygulama olabileceğini biliyorum bu

id TableACSV 
1 Turret Punch Press,Laser Machine 
2 Turret Punch Press,Press Brake 

gibi olmalıdır istiyorum ama çıkış şu anda ben bu ihtiyaç ..

+0

Ayrıca 'MySQL' için sorguya ihtiyacınız var mı? – Squirrel

+0

@Squirrel no only sql-server ... mysql etiketini kaldırmayı düşünüyorum – KanisXXX

+0

Google: 'SQL Server group_concat' – sagi

cevap

0

bir CSV splitter DelimitedSplit8K

; WITH CTE AS 
(
    SELECT b.id, a.name 
    FROM TableB b 
    CROSS APPLY dbo.DelimitedSplit8K(b.TableACSV, ',') c 
    INNER JOIN TableA a on c.Item = a.id 
) 
SELECT DISTINCT c.id, STUFF(d.name, 1, 1, '') AS TableACSV 
FROM CTE c 
    CROSS APPLY 
    (
     SELECT ',' + x.name 
     FROM CTE x 
     WHERE x.id = c.id 
     FOR XML PATH ('') 
    ) d (name) 
kullanma
+0

Bu durumda dize bölme, karın ağrısı için Band-Aid uygulanması gibidir. OP, kimlikleri ayırmalı, arama kaynağıyla birleştirmeli ve ardından arama değerlerini yeniden toplamalıdır. Her halükarda, Aaron Bertrand dizeleri ayırmak için çeşitli yöntemlerin daha kapsamlı bir karşılaştırmasını yapar (http://sqlperformance.com/2012/07/t-sql-queries/split-strings). Bir CLR çözümü, doğrudan/birleştirme/yeniden birleştirme sırasından kaçınarak doğrudan aramayı probalive edebilir. –

+0

verilen örnek üzerinde çalışıyor .... !!! benim gerçek senaryoyu test etmem gerekiyor ... – KanisXXX