salve,
non e' che hai dato un grande aiuto alla definizione dello schema... delle volte aiuta anche lo script DDL di generazione con un po' di INSERT INTO per popolarlo...
non so se ho ben capito le tue richieste, ma, utilizzando SQL Server,
SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.Contatti (
Id int NOT NULL PRIMARY KEY,
Denominazione varchar(10) NOT NULL
);
CREATE TABLE dbo.Gruppi (
Id int NOT NULL PRIMARY KEY,
Gruppo varchar(10) NOT NULL
);
CREATE TABLE dbo.GruppiContatti (
Id int NOT NULL PRIMARY KEY,
IdGruppo int NOT NULL
CONSTRAINT fk_gruppi_gruppicontatti
FOREIGN KEY
REFERENCES dbo.Gruppi (Id),
IdContatto int NOT NULL
CONSTRAINT fk_contatti_gruppicontatti
FOREIGN KEY
REFERENCES dbo.Contatti (Id)
);
CREATE TABLE dbo.GruppiContatti2 (
Id int NOT NULL PRIMARY KEY,
IdGruppoContatto int NOT NULL
CONSTRAINT fk_gruppicontatti_gruppicontatti2
FOREIGN KEY
REFERENCES dbo.GruppiContatti (Id),
IdContatto int NOT NULL
CONSTRAINT fk_contatti_gruppicontatti2
FOREIGN KEY
REFERENCES dbo.Contatti (Id)
);
CREATE TABLE dbo.LivelliLivelli (
Id int NOT NULL PRIMARY KEY,
numerazione int NOT NULL,
IdGruppoContatto2 int NOT NULL
CONSTRAINT fk_gruppicontatti2_livellilivelli
FOREIGN KEY
REFERENCES dbo.GruppiContatti2 (Id),
IdContatto int NOT NULL
CONSTRAINT fk_contatti_livellilivelli
FOREIGN KEY
REFERENCES dbo.Contatti (Id)
);
GO
INSERT INTO dbo.Contatti VALUES ( 1 , 'Peste1' );
INSERT INTO dbo.Contatti VALUES ( 2 , 'Andrea' );
INSERT INTO dbo.Gruppi VALUES ( 1, 'Gruppo 1' );
INSERT INTO dbo.Gruppi VALUES ( 2, 'Gruppo 2' );
INSERT INTO dbo.Gruppi VALUES ( 3, 'Gruppo 3' );
INSERT INTO dbo.GruppiContatti VALUES ( 1 , 1 , 1 );
INSERT INTO dbo.GruppiContatti VALUES ( 2 , 1 , 2 );
INSERT INTO dbo.GruppiContatti VALUES ( 3 , 2 , 1 );
INSERT INTO dbo.GruppiContatti VALUES ( 4 , 2 , 2 );
INSERT INTO dbo.GruppiContatti VALUES ( 5 , 3 , 1 );
INSERT INTO dbo.GruppiContatti VALUES ( 6 , 3 , 2 );
INSERT INTO dbo.GruppiContatti2 VALUES ( 1 , 1 , 1 );
INSERT INTO dbo.GruppiContatti2 VALUES ( 2 , 1 , 2 );
INSERT INTO dbo.GruppiContatti2 VALUES ( 3 , 2 , 2 );
INSERT INTO dbo.LivelliLivelli VALUES ( 1 , 50, 1, 1 );
INSERT INTO dbo.LivelliLivelli VALUES ( 2 , 25, 1, 2 );
INSERT INTO dbo.LivelliLivelli VALUES ( 3 , 50, 2, 1 );
INSERT INTO dbo.LivelliLivelli VALUES ( 4 , 25, 2, 2 );
GO
SELECTg.Id AS [IdGruppo], g.Gruppo,
c.Id AS [IdContatto], c.Denominazione,
gc.Id AS [IdGruppoContatto], gc.IdContatto, gc.IdGruppo,
gc2.Id AS [IdGruppoContatto2],
l.Id AS [IdLivello], l.numerazione
FROM dbo.LivelliLivelli l
JOIN dbo.GruppiContatti2 gc2 ON gc2.Id = l.IdGruppoContatto2
JOIN dbo.GruppiContatti gc ON gc.Id = gc2.IdGruppoContatto
JOIN dbo.Contatti c ON c.Id = gc.IdContatto
JOIN dbo.Gruppi g ON g.Id = gc.IdGruppo
GO
DROP TABLE dbo.LivelliLivelli, dbo.GruppiContatti2, dbo.GruppiContatti, dbo.Gruppi, dbo.Contatti;
--<-----------
IdGruppo Gruppo IdContatto Denominazione IdGruppoContatto IdContatto IdGruppo IdGruppoContatto2 IdLivello numerazione
----------- ---------- ----------- ------------- ---------------- ----------- ----------- ----------------- ----------- -----------
1 Gruppo 1 1 Peste1 1 1 1 1 1 50
1 Gruppo 1 1 Peste1 1 1 1 1 2 25
1 Gruppo 1 1 Peste1 1 1 1 2 3 50
1 Gruppo 1 1 Peste1 1 1 1 2 4 25
restituisce in effetti l'esplosione delle join come definite... chiaramente, un popolamento parziale come nell'esempio esclude la visualizzazione di molti dati nelle tabelle referenziate, visto che le join tendono a filtrare "verso l'alto" a meno che non siano correttamente bilanciate le istruzioni di insert (e qui non lo sono), a meno di non usare outer join sulle tabelle referenziate..
saluti..