21 messaggi dal 06 settembre 2002
www.xhtmlstrict.it
Ciao a tutti,
sto realizzando un applicativo in Delphi e mi trovo in difficoltà nella stesura di una query.

SCHEMA
http://www.prodest.biz/public/schemasql1.jpg

Sono tutti JOIN che seguono la freccia, quindi:
Tutti i record in GRUPPI, ma solo i record di GRUPPICONTATTI dove GRUPPICONTATTI.IDGRUPPO = GRUPPI.ID ecc.

E fin qui ci siamo. Il problema è che i contatti che devono essere visualizzati sono memorizzati in una tabella in comune (CONTATTI).

Come posso fare?
Utilizzando la procedura guidata di creazione delle query in MS Access non riesco a cavare un ragno da un buco.

Spero di essere stato chiaro.
Help me

Stefano Pessina
1.976 messaggi dal 27 luglio 2005
Contributi
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..

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.