106 messaggi dal 16 ottobre 2001
Ciao a tutti, vorrei sapere come posso risolvere questo mio problema.

Cerco di semplificare:
ho una query
select * from ttabella1
che mi restituisce n record.
All'interno di ttabella1 ho un campo Chiave con la tabella ttabella2.

A 1 record di ttabella1 corrispondono n record di ttabella2.

Ogni riga estratta deve contenere i campi di ttabella1 più un campo che contiene i dati di un campo di ttabella2 concatenati (divisi da un separatore.)
Non so se mi sono spiegata bene...
Potete darmi una mano?
Grazie!
1.976 messaggi dal 27 luglio 2005
Contributi
salve Sandra,
sandra ha scritto:
Ciao a tutti, vorrei sapere come posso risolvere questo mio problema.

Cerco di semplificare:
ho una query
select * from ttabella1
che mi restituisce n record.
All'interno di ttabella1 ho un campo Chiave con la tabella ttabella2.

A 1 record di ttabella1 corrispondono n record di ttabella2.

Ogni riga estratta deve contenere i campi di ttabella1 più un campo che contiene i dati di un campo di ttabella2 concatenati (divisi da un separatore.)
Non so se mi sono spiegata bene...
Potete darmi una mano?
Grazie!


se ho ben compreso la tua necessita', puoi utilizzare la semplice concatenazione eseguita su una variabile locale in una funzione utente, similarmente a
SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.tTabella1 (
Id int NOT NULL PRIMARY KEY ,
Dati varchar(5)
);
CREATE TABLE dbo.tTabella2 (
Id int NOT NULL PRIMARY KEY ,
Idtb1 int NOT NULL
CONSTRAINT fk_tTabella1_tTabella2
FOREIGN KEY REFERENCES dbo.tTabella1 ( Id ),
Testo varchar(10)
);
GO
CREATE FUNCTION dbo.ufn_Aggrega (
@Id int ,
@sep char(1)
) RETURNS varchar(100)
AS BEGIN
DECLARE @tmp varchar(100);
SET @tmp = '';

SELECT @tmp = CASE WHEN DATALENGTH(@tmp) <> 0 THEN @tmp + @sep ELSE @tmp END + Testo
FROM dbo.tTabella2
WHERE Idtb1 = @id
ORDER BY Id;

RETURN (@tmp);
END
GO
INSERT INTO dbo.tTabella1 VALUES ( 1 , 'Riga1' );
INSERT INTO dbo.tTabella1 VALUES ( 2 , 'Riga2' );

INSERT INTO dbo.tTabella2 VALUES ( 1 , 1 , 'a' );
INSERT INTO dbo.tTabella2 VALUES ( 2 , 1 , 'b' );
INSERT INTO dbo.tTabella2 VALUES ( 3 , 1 , 'c' );

INSERT INTO dbo.tTabella2 VALUES ( 4 , 2 , 'z' );
INSERT INTO dbo.tTabella2 VALUES ( 5 , 2 , 'v' );
INSERT INTO dbo.tTabella2 VALUES ( 6 , 2 , 'u' );
INSERT INTO dbo.tTabella2 VALUES ( 7 , 2 , 'x' );
INSERT INTO dbo.tTabella2 VALUES ( 8 , 2 , 'y' );
GO
SELECT t1.Id, t1.Dati,
dbo.ufn_Aggrega( t1.Id, '|' ) AS [Aggregazione]
FROM dbo.tTabella1 t1
ORDER BY t1.Id;
GO
DROP FUNCTION dbo.ufn_Aggrega ;
DROP TABLE dbo.tTabella2, dbo.tTabella1 ;

che ritorna
--<---------
Id Dati Aggregazione
----------- ----- ------------
1 Riga1 a|b|c
2 Riga2 z|v|u|x|y

chiaramente tale concatenazione non puo' superare in SQL Server 2000 la dimensione di varchar(8000)
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.