Problema Join

mercoledì 13 maggio 2009 - 12.46

luxsor Profilo | Guru

Ciao a tutti,
ho il seguente problema, su come poter estrarre i dati da due tabelle.
Il problema che la tabella MODULI contiene un IDSinistroVeicoloA e un IDSinistroVeicoloB che fanno riferimento sempre alla tabella DATISINISTRO.

Usando questa query mi estrae solo i dati inerenti alla seconda Join, invece quella della prima Join me li scarta.
SELECT M.idmodulo as [ID Pratica] FROM ((moduli as M left JOIN datisinistro AS Sa ON M.idsinistroveicoloa = Sa.ID) LEFT JOIN datisinistro AS S ON M.idsinistroveicoloB = S.ID)

Come posso avere un resultset con tutti i valori di entrambe le JOIN?

Questo è lo schema del DB
USE [tempdb]
GO
/****** Oggetto: Table [dbo].[datisinistro] Data script: 04/24/2009 21:49:04 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[datisinistro](
[id] [int] IDENTITY(1,1) NOT NULL,
[cognomecontraente] [nvarchar](50) NULL,
[nomecontraente] [nvarchar](50) NULL,
[cittacontraente] [nvarchar](100) NULL,
[indirizzocontraente] [nvarchar](100) NULL,
[numerocontraente] [nvarchar](10) NULL,
[capcontraente] [nvarchar](10) NULL,

) ON [PRIMARY]

USE [tempdb]
GO
/****** Oggetto: Table [dbo].[moduli] Data script: 04/19/2009 19:07:22 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[moduli](
[idmodulo] [int] IDENTITY(1,1) NOT NULL,
[dataincidente] [datetime] NULL,
[idsinistroveicoloa] [int] NULL,
[idsinistroveicolob] [int] NULL,

) ON [PRIMARY]



------------------------
Luxsor

alx_81 Profilo | Guru

potresti postare anche qualche insert e il resultset che vorresti ottenere?
grazie
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

luxsor Profilo | Guru

INSERT INTO [tempdb].[dbo].[moduli]
([dataincidente]
,[idsinistroveicoloa]
,[idsinistroveicolob])
VALUES
('12/05/2009'
,1
,2)

INSERT INTO [tempdb].[dbo].[datisinistro]
([cognomecontraente]
,[nomecontraente]
,[cittacontraente]
,[indirizzocontraente]
,[numerocontraente]
,[capcontraente])
VALUES
('Carmelo'
,'Luxsor'
,'Roma'
,'Corso Vittorio Emanuele'
,'1'
,'7000')

INSERT INTO [tempdb].[dbo].[datisinistro]
([cognomecontraente]
,[nomecontraente]
,[cittacontraente]
,[indirizzocontraente]
,[numerocontraente]
,[capcontraente])
VALUES
('Alessandro'
,'luxsor'
,'Milano'
,'Via Mazzini'
,'33'
,'8000')

Il resulset che vorrei è:

DATAINCIDENTE|COGNOMECONTRAENTE|NOMECONTRAENTE|CITTACONTRAENTE|NUMEROCONTRAENTE|CAPCONTRAENTE|COGNOMECONTRAENTE|NOMECONTRAENTE|CITTACONTRAENTE|NUMEROCONTRAENTE|CA

12/05/2009 | Carmelo | luxsor | Roma | 1 | 70000 | Alessandro | Luxsor | Milano | 33 | 8000

------------------------
Luxsor

alx_81 Profilo | Guru

>DATAINCIDENTE|COGNOMECONTRAENTE|NOMECONTRAENTE|CITTACONTRAENTE|NUMEROCONTRAENTE|CAPCONTRAENTE|COGNOMECONTRAENTE|NOMECONTRAENTE|CITTACONTRAENTE|NUMEROCONTRAENTE|CA
>
>12/05/2009 | Carmelo | luxsor
>| Roma | 1 | 70000
>| Alessandro | Luxsor | Milano
>| 33 | 8000
Con le insert che mi hai dato, una query del genere sembra funzionare:


SELECT M.dataincidente , CognomeContraente1 = DS1.cognomecontraente , NomeContraente1 = DS1.nomecontraente , CittaContraente1 = DS1.cittacontraente , NumeroContraente1 = DS1.numerocontraente , CapContraente1 = DS1.capcontraente , CognomeContraente2 = DS2.cognomecontraente , NomeContraente2 = DS2.nomecontraente , CittaContraente2 = DS2.cittacontraente , NumeroContraente2 = DS2.numerocontraente , CapContraente2 = DS2.capcontraente FROM dbo.moduli M LEFT JOIN dbo.datisinistro DS1 ON M.idsinistroveicoloA = DS1.ID LEFT JOIN dbo.datisinistro DS2 ON M.idsinistroveicoloB = DS2.ID
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

lbenaglia Profilo | Guru

>Il resulset che vorrei è:
>
>DATAINCIDENTE|COGNOMECONTRAENTE|NOMECONTRAENTE|CITTACONTRAENTE|NUMEROCONTRAENTE|CAPCONTRAENTE|COGNOMECONTRAENTE|NOMECONTRAENTE|CITTACONTRAENTE|NUMEROCONTRAENTE|CA
>
>12/05/2009 | Carmelo | luxsor
>| Roma | 1 | 70000
>| Alessandro | Luxsor | Milano
>| 33 | 8000
>

Ecco qua:

SELECT M.dataincidente , DS1.cognomecontraente , DS1.nomecontraente , DS1.cittacontraente , DS1.numerocontraente , DS1.capcontraente , DS2.cognomecontraente , DS2.nomecontraente , DS2.cittacontraente , DS2.numerocontraente , DS2.capcontraente FROM dbo.moduli AS M JOIN dbo.datisinistro AS DS1 ON M.idsinistroveicoloa = DS1.id JOIN dbo.datisinistro AS DS2 ON M.idsinistroveicolob = DS2.id;

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

luxsor Profilo | Guru

Grazie Alex e Lorenzo per l'aiuto,
adoperando questa soluzione per filtrare alcuni campi con la clausola Where sono costretto a specificare entrambe le tabelle DS1 e DS2?
WHERE DS1.cognomecontraente ='Carmelo' OR DS2.cognomecontraente ='Carmelo'

Esiste un metodo per fare in modo che eseguo la Where specificando solo un nome cioè racchiedere quelle tabelle DS1 e DS2 in un unica DS ?

Esempio
WHERE DS.cognomecontraente = 'Carmelo" AND DS.cittacontraente='Roma' ecc....

Grazie ancora


------------------------
Luxsor

lbenaglia Profilo | Guru

>adoperando questa soluzione per filtrare alcuni campi con la
>clausola Where sono costretto a specificare entrambe le tabelle
>DS1 e DS2?
Dipende.

>WHERE DS1.cognomecontraente ='Carmelo' OR DS2.cognomecontraente
>='Carmelo'
Se vuoi filtrare per cognome devi specificare la OR dato che i 2 contraenti possono essere diversi (anche se non vedo il senso di questo filtro).

>Esiste un metodo per fare in modo che eseguo la Where specificando
>solo un nome cioè racchiedere quelle tabelle DS1 e DS2 in un
>unica DS ?
>
>Esempio
>WHERE DS.cognomecontraente = 'Carmelo" AND DS.cittacontraente='Roma'
>ecc....
No.

>Grazie ancora
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
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