Post by Andrewti ho messo i nomi delle colonne ... e il campoX stava ad indicare che
possono esserce altri 5 come 0 ... non ha importanza ... a me serve un
sistema per recuperare quello che c'è a partire dal padre.
Si, ma il fatto è che le tabelle che hai postato non hanno alcuna colonna
che si chiama "Campo".
Vorrei capire che dati di origin avranno quelle colonne...
Post by Andrewcioè immaginando la struttura sopra
id, prodotto1 <- questi sono i dati della master table ..
id, prodotto1, camp1, campo2, campo3 ....
se poi esiste un prodotto2 che ha solo campo1, campo2 ... recupero
solo quelli ...
Qui sorge uno spinoso problema: l'operatore PIVOT di SQL Server 2005 non
permette di scrivere query crosstab dinamiche, pertanto hai 3 soluzioni:
1) Adatti la sp di Itzik alle tue esigenze:
http://www.sqlmag.com/Articles/Index.cfm?ArticleID=15608
2) Ti scrivi una nuova sp basata sull'operatore PIVOT che tramite il Dynamic
SQL, restituisce un numero variabile di colonne (puoi prendere spunto dalla
sp del punto 1).
3) Inserisci tutti i dati della tabella figlia in 1 sola colonna
eventualmente con un separatore.
Google non ha indicizzato un thread del 17 ottobre 2006, quindi ti riporto
la mia risposta:
<POST>
L'argomento è stato affrontato in modo approfondito lo scorso mese di luglio
in questo thread:
http://groups.google.it/group/microsoft.public.it.sql/browse_frm/thread/25ec5df1a3d03ce9
In aggiunta a quanto troverai scritto, vorrei aggiungere una ulteriore
soluzione proposta da Itzik basata sulla clausula FOR XML PATH:
USE tempdb;
GO
CREATE TABLE dbo.TabellaA(
id_a int NOT NULL PRIMARY KEY,
descrizione varchar(10) NOT NULL
);
GO
CREATE TABLE dbo.TabellaB(
id_b int NOT NULL PRIMARY KEY,
step varchar(10) NOT NULL,
id_a int NOT NULL,
CONSTRAINT FK_TabellaB_TabellaA FOREIGN KEY(id_a)
REFERENCES dbo.TabellaA(id_a)
);
GO
INSERT dbo.TabellaA VALUES(1, 'gruppo1');
INSERT dbo.TabellaB VALUES(1, 'step1', 1);
INSERT dbo.TabellaB VALUES(2, 'step2', 1);
INSERT dbo.TabellaB VALUES(3, 'step3', 1);
GO
/* Query */
SELECT
id_a
, descrizione
, STUFF(
(SELECT ' ' + CAST(step AS VARCHAR(MAX)) AS [text()]
FROM (SELECT DISTINCT step
FROM dbo.TabellaB AS B
WHERE B.id_a = A.id_a) AS D
ORDER BY step
FOR XML PATH('')),
1, 1, '') AS Steps
FROM dbo.TabellaA AS A;
GO
/* Output:
id_a descrizione Steps
----------- ----------- -------------------
1 gruppo1 step1 step2 step3
(1 row(s) affected)
*/
DROP TABLE dbo.TabellaB, dbo.TabellaA;
Semplicemente geniale
Per maggiori informazioni consulta il seguente paragrafo dei Books Online:
"Using PATH Mode"
http://msdn2.microsoft.com/en-us/library/ms189885.aspx
</POST>
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org