2017-10-27 1 views
1

Ich habe 2 Tabellen:Split und innere Verknüpfung Rückgabe-String in Reihe SQL Server 2008

Table1

ID Name  
------------ 
    1 Cpu   
    2 Vga   
    3 Ram 

Table2:

ID Names  
------------- 
    1 1;2    
    2 1;2;3   
    3 2    

Ich möchte Ergebnis: Wählen Sie in Tabelle 2:

ID Names  Names string 
---------------------------- 
    1 1;2  Cpu,Vga   
    2 1;2;3  Cpu,Vga,Ram  
    3 2   Vga    

Wie löst man mein Problem? Danke

+0

Sind diese Ihre aktuellen Tabellen, oder zogen sie Beispiele unten? –

Antwort

0

Dies hier wird den Trick für Sie tun.

Sie müssen eine Funktion erstellen, die Ihre Zeilen aufteilen kann, damit Sie sie später verbinden können, und verwenden Sie som XML, um Ihre Zeilen zurück zu fassen.

Sie benötigen eine Funktion erstellen, die Ihre Zeilen aufspalten oder unconcat

CREATE FUNCTION [dbo].[dba_parseString_udf] (
     @stringToParse VARCHAR(8000) 
    , @delimiter  CHAR(1) 
) 
RETURNS @parsedString TABLE (stringValue VARCHAR(128)) AS 
BEGIN 

/* Declare variables */ 
DECLARE @trimmedString VARCHAR(8000); 

/* We need to trim our string input in case the user entered extra spaces */ 
SET @trimmedString = LTRIM(RTRIM(@stringToParse)); 

/* Let's create a recursive CTE to break down our string for us */ 
WITH parseCTE (StartPos, EndPos) 
AS 
(
    SELECT 1 AS StartPos 
     , CHARINDEX(@delimiter, @trimmedString + @delimiter) AS EndPos 
    UNION ALL 
    SELECT EndPos + 1 AS StartPos 
     , CHARINDEX(@delimiter, @trimmedString + @delimiter , EndPos + 1) AS EndPos 
    FROM parseCTE 
    WHERE CHARINDEX(@delimiter, @trimmedString + @delimiter, EndPos + 1) <> 0 
) 

/* Let's take the results and stick it in a table */ 
INSERT INTO @parsedString 
SELECT SUBSTRING(@trimmedString, StartPos, EndPos - StartPos) 
FROM parseCTE 
WHERE LEN(LTRIM(RTRIM(SUBSTRING(@trimmedString, StartPos, EndPos - StartPos)))) > 0 
OPTION (MaxRecursion 8000); 

RETURN; 
END 

Inner Tisch hier ist Ihre Table2 und Split-Tabelle ist Ihr tabelle1

SQL-Code zu run

with result as (
SELECT [id] 
     ,[name] 
     ,i.stringValue 
from [LegOgSpass].[dbo].[inner] as a 
    cross apply [dbo].[dba_parseString_udf](a.Name,';') i 
) 

    ,partresult as (
    select a.id,a.name,b.name as RowstoConcat from result a 
    left join LegOgSpass.dbo.split b on a.stringValue = b.id 
) 
    SELECT id,Name, Pets = STUFF((SELECT N', ' + RowstoConcat 
    FROM partresult AS p2 
    WHERE p2.name = p.name 
    ORDER BY RowstoConcat 
    FOR XML PATH(N'')), 1, 2, N'') 
FROM partresult AS p 
GROUP BY id,Name 
ORDER BY id,Name 

Ergebnis

enter image description here

+0

Dank plaidDK, Problem zu lösen – DucAnhNguyen

0
;WITH cte AS (
SELECT * FROM Table1 t1 
INNER JOIN (
    SELECT id AS t2_id, VALUE AS nameid 
    FROM Table2 t2 
    CROSS APPLY STRING_SPLIT(Names,';') 
    ) t3 
ON t1.id=t3.nameid 
) 
SELECT id , 
    STUFF((SELECT ','+ Name FROM cte c2 where c.id =c2.t2_id FOR XML PATH('')),1,1,'') 
    AS [Name String], 

    STUFF ((SELECT ','+ cast(t2_id as varchar) from cte c2 
    WHERE c.id=c2.nameid FOR XML PATH('')),1,1,'') AS Names 
FROM cte c 
GROUP BY id 

OUTPUT

id Name String Names 
1  Cpu,Vga   1,2 
2  Cpu,Vga,Ram  1,2,3 
3  Vga    2 

HINWEIS

Wie @plaidDK dass in Kommentaren darauf hingewiesen,

STRING_SPLIT() keine Funktion von SQL SERVER 2008 ist, die obige Abfrage hilft, wenn Sie einige gespeicherte Prozeduren finden, um das Funktionale zu tun STRING_SPLIT(). Und Ersatz STRING_SPLIT() mit Name der gespeicherten Prozedur

+0

String Split ist keine Funktion in SQL Server 2008 – plaidDK

+0

@plaidDK Danke für die Info. Vielleicht kann er eine gespeicherte Prozedur verwenden, um die Funktionalität von 'string_split' zu tun. – jophab

+1

danke jophab, ich werde sql 2012 ^^ – DucAnhNguyen