Query SQL

lunedì 27 agosto 2007 - 14.36

lolic Profilo | Newbie

Ciao a tutti,
devo scrivere una query Sql che collega tre tabelle mediante un ID in esso contenute. Il risultato della query deve contenere sia i record presenti nella singola tabella sia i record in comune.
Segue un esempio

Table1 [IDTable1,ID,Campo1] = {(1,1,"Table1a"),(2,2,Table1b")}
Table2 [IDTable2,ID,Campo2] = {(1,2,"Table2a"),(2,3,"Table2b")}
Table3 [IDTable3,ID,Campo3] = {.... }

La query utilizza il campo ID per correlare le tabelle e nella clausola di select devo invece avere:
ID,Campo1,Campo2,Campo3

Risultato Query
1, "Table1a",null,null //Perchè contenuto nella Table1
2, "Table1b,"Table2a",null //Perchè contenuto nella Table1 e Table2
3, null,"Table2b",null // Perchè contenuto nella Table2

N.B: non posso usare la clausola distinct

killer Profilo | Newbie

devi utilizzare group by pero devi stare attento perche agggrega i campi non li toglie...

lolic Profilo | Newbie

Scusa ma non vedo a cosa mi possa servire group by. Magari mi sono espresso male nello scrivere, ma il contenuto di ciascuna table risiede in una colonna differente nel risultato della query e l'unica cosa che le accomuna è l'ID.

Io pensavo di usare una cosa simile alla FULL OUTER JOIN solo che usando tale operatore nel caso in cui vi siano due ID uguali in due table distinte nell'output della query compaiono due record anzichè uno unico.

lbenaglia Profilo | Guru

>devo scrivere una query Sql che collega tre tabelle mediante
>un ID in esso contenute. Il risultato della query deve contenere
>sia i record presenti nella singola tabella sia i record in comune.
>Segue un esempio
Direi che è un po' poverino come esempio, non trovi?
Prima di tutto che DBMS stai utilizzando? (query SQL è troppo generico ).
Secondo, puoi postare i comandi SQL di CREATE TABLE, INSERT INTO ed il result set finale che vuoi ottenere con i dati postati?

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

lolic Profilo | Newbie

>>devo scrivere una query Sql che collega tre tabelle mediante
>>un ID in esso contenute. Il risultato della query deve contenere
>>sia i record presenti nella singola tabella sia i record in comune.
>>Segue un esempio
>Direi che è un po' poverino come esempio, non trovi?
Hai perfettamente ragione scusa.

>Prima di tutto che DBMS stai utilizzando? (query SQL è troppo
>generico ).
Sto utilizzando SQL Server 2005 Express Edition

>Secondo, puoi postare i comandi SQL di CREATE TABLE, INSERT INTO
>ed il result set finale che vuoi ottenere con i dati postati?

Seguono le table di un database di prova (semplificato) che sto utilizzando per scrivere la query
(Le tre tabelle seguenti sono partizione di una tabella VALUTAZIONI, non inserita)

Comandi di CREATE TABLE:

CREATE TABLE [dbo].[VALUTAZIONE1](
[IDVALUTAZIONE1] [int] IDENTITY(1,1) NOT NULL,
[IDASSOCIAZIONE] [int] NOT NULL,
[CAMPO1] [varchar](255) COLLATE Latin1_General_CI_AS NULL,
CONSTRAINT [PK_VALUTAZIONE1] PRIMARY KEY CLUSTERED
(
[IDVALUTAZIONE1] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]


CREATE TABLE [dbo].[VALUTAZIONE2](
[IDVALUTAZIONE2] [int] IDENTITY(1,1) NOT NULL,
[IDASSOCIAZIONE] [int] NOT NULL,
[CAMPO2] [varchar](255) COLLATE Latin1_General_CI_AS NULL,
CONSTRAINT [PK_VALUTAZIONE2] PRIMARY KEY CLUSTERED
(
[IDVALUTAZIONE2] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]


CREATE TABLE [dbo].[VALUTAZIONE3](
[IDVALUTAZIONE3] [int] IDENTITY(1,1) NOT NULL,
[IDASSOCIAZIONE] [int] NOT NULL,
[CAMPO3] [varchar](255) COLLATE Latin1_General_CI_AS NULL,
CONSTRAINT [PK_VALUTAZIONE3] PRIMARY KEY CLUSTERED
(
[IDVALUTAZIONE3] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

Comandi di INSERT:

INSERT INTO VALUTAZIONE1
(IDASSOCIAZIONE
,CAMPO1)
VALUES
(1,'VALUTAZIONE1a')


INSERT INTO VALUTAZIONE2
(IDASSOCIAZIONE
,CAMPO2)
VALUES
(1,'VALUTAZIONE2a')

INSERT INTO VALUTAZIONE2
(IDASSOCIAZIONE
,CAMPO2)
VALUES
(2,'VALUTAZIONE2b')

INSERT INTO VALUTAZIONE3
(IDASSOCIAZIONE,CAMPO3)
VALUES
(3,'VALUTAZIONE3a')


OUTPUT DESIDERATO:

IDASSOCIAZIONE CAMPO1 CAMPO2 CAMPO3
1 Valutazione1a Valutazione2a null
2 null Valutazione2b null
3 null null Valutazione3a



Tento di spiegare anche a parole il mio intento.
Date una serie di valutazioni eseguite per una specifica Associazione (IDASSOCIAZIONE), devo mostrare una tabella di riepilogo contenente inizialmente i dati relativi all'associazione e poi sulle varie colonne i dati delle valutazioni. Le valutazioni di una data Associazione possono però non essere state eseguite.
N.B.: è garantito che per ciascuna Associazione vi sia una singola valutazione dato un tipo. Un'associazione però può avere più valutazioni di tipo diverso.

>
>Ciao!
>--
>Lorenzo Benaglia
>Microsoft MVP - SQL Server
>http://blogs.dotnethell.it/lorenzo/
>http://italy.mvps.org

lbenaglia Profilo | Guru

>Seguono le table di un database di prova (semplificato) che sto
>utilizzando per scrivere la query

Prova a vedere il seguente esempio:

USE tempdb; SET ANSI_WARNINGS OFF; CREATE TABLE dbo.VALUTAZIONE1( IDVALUTAZIONE1 int IDENTITY(1,1) NOT NULL, IDASSOCIAZIONE int NOT NULL, CAMPO1 varchar(15) NULL, CONSTRAINT PK_VALUTAZIONE1 PRIMARY KEY(IDVALUTAZIONE1) ); CREATE TABLE dbo.VALUTAZIONE2( IDVALUTAZIONE2 int IDENTITY(1,1) NOT NULL, IDASSOCIAZIONE int NOT NULL, CAMPO2 varchar(15) NULL, CONSTRAINT PK_VALUTAZIONE2 PRIMARY KEY(IDVALUTAZIONE2) ); CREATE TABLE dbo.VALUTAZIONE3( IDVALUTAZIONE3 int IDENTITY(1,1) NOT NULL, IDASSOCIAZIONE int NOT NULL, CAMPO3 varchar(15) NULL, CONSTRAINT PK_VALUTAZIONE3 PRIMARY KEY(IDVALUTAZIONE3) ); INSERT dbo.VALUTAZIONE1 VALUES(1,'VALUTAZIONE1a'); INSERT dbo.VALUTAZIONE2 VALUES(1,'VALUTAZIONE2a'); INSERT dbo.VALUTAZIONE2 VALUES(2,'VALUTAZIONE2b'); INSERT dbo.VALUTAZIONE3 VALUES(3,'VALUTAZIONE3a'); WITH CTE_Associazioni(IDASSOCIAZIONE, CAMPO1, CAMPO2, CAMPO3) AS ( SELECT IDASSOCIAZIONE , CAMPO1 , NULL , NULL FROM dbo.VALUTAZIONE1 UNION ALL SELECT IDASSOCIAZIONE , NULL , CAMPO2 , NULL FROM dbo.VALUTAZIONE2 UNION ALL SELECT IDASSOCIAZIONE , NULL , NULL , CAMPO3 FROM dbo.VALUTAZIONE3 ) SELECT IDASSOCIAZIONE , MAX(CAMPO1) AS CAMPO1 , MAX(CAMPO2) AS CAMPO2 , MAX(CAMPO3) AS CAMPO3 FROM CTE_Associazioni GROUP BY IDASSOCIAZIONE; /* Output: IDASSOCIAZIONE CAMPO1 CAMPO2 CAMPO3 -------------- --------------- --------------- --------------- 1 VALUTAZIONE1a VALUTAZIONE2a NULL 2 NULL VALUTAZIONE2b NULL 3 NULL NULL VALUTAZIONE3a (3 row(s) affected) */ DROP TABLE dbo.VALUTAZIONE1, dbo.VALUTAZIONE2, dbo.VALUTAZIONE3;

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

lolic Profilo | Newbie

Grazie per l'aiuto.
In questi giorni proverò e testerò la soluzione nel caso pratico un po' più complesso.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5