Salve,
la concatenazione di "stringhe" puo' essere effettuata utilizzando l'espressione FOR XML PATH, vedi
https://sqlandme.com/2011/04/27/tsql-concatenate-rows-using-for-xml-path/
nell'esempio, viene utilizzata una sub query per ogni riga restituita dalla query principale su Production.ProductCategory... si puo' ovviamente suddividere la query eseguendo una common table expression da mettere poi in JOIN con la query principale...
trivialmente,
PRINT 'esplosione di JOIN completa...';
SELECT a.CODICE AS [Cod.Ricambio]
, a4.CODICE AS [Mod.Principale]
FROM dbo.ARTICLA4 a4
JOIN dbo.ARTICO a ON a.IDARTCLA4 = a4.Id
WHERE 1 = 1-- il tuo filtro;
PRINT 'tradotto in sub-query in linea..';
SELECT a.CODICE AS [Cod.Ricambio],
STUFF((SELECT '-' + a4.CODICE AS [text()]
FROM dbo.ARTICLA4 a4
WHERE a4.Id = a.Id
FOR XML PATH('')
), 1, 1, '' ) AS [Mod.Principale]
FROM dbo.ARTICO a
WHERE 1 = 1-- il tuo filtro;
PRINT 'tradotto in common table expression da mettere poi in JOIN..';
WITH cteRicambi AS (
SELECT a.Id,
STUFF((SELECT '-' + a4.CODICE AS [text()]
FROM dbo.ARTICLA4 a4
WHERE a4.Id = a.Id
FOR XML PATH('')
), 1, 1, '' ) AS [Mod.Principale]
FROM dbo.ARTICO a
)
SELECT a.CODICE AS [Cod.Ricambio]
, r.[Mod.Principale]
FROM dbo.ARTICO a
LEFT JOIN cteRicambi r ON r.[Id] = a.[Id]
WHERE 1 = 1-- il tuo filtro;
--<-------
esplosione di JOIN completa...
Cod.Ricambio Mod.Principale
------------ --------------
art1 mod1
art2 mod1
art3 mod1
art2 mod2
art3 mod2
tradotto in sub-query in linea..
Cod.Ricambio Mod.Principale
------------ --------------
art1 mod1
art2 mod1-mod2
art3 mod1-mod2
art.4 NULL
tradotto in common table expression da mettere poi in JOIN..
Cod.Ricambio Mod.Principale
------------ --------------
art1 mod1
art2 mod1-mod2
art3 mod1-mod2
art.4 NULL
le common table expression, al di la' del fatto che i piani di escuzione, i risultati e le performace siano identici rispetto alle sub query inline, sono solitamente piu' "accattivanti" da usare in quanto "visivamente" sono piu' leggibili...
giusto per informazione, sarebbe (almeno per la mia esperieza) indicato postare anche un mini scenario composto dal DDL (CREATE TABLE) e istruzioni INSERT INTO minimali al fine di far si che chi voglia aiutare non debba rigenerare l'intero scenario anche con l'ovvio rischio di sbagliare nelle intenzioni...
invece, riguardo al tua query, personalmente ti consiglio di referenziare gli oggetti coinvolti sempre in maniera completa, quindi indicandoli sempre come [schema_name].[object_name], diversamente i processori della query di SQL Server saranno sempre costretti a generare un nuovo piano di esecuzione ad ogni chiamata, senza poter quindi riutilizzare quelli gia' nella cache, con dispendio inuntile di risorse...
saluti omnia
--
Andrea