salve,
jampicoll wrote:
Si lo so che non ha alcun senso...ma purtroppo è quello che mi serve. Per me andrebbe bene anche la prima che trova(quella con idServizio più basso).
Utilizzo SQL Server Express.
SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.Curriculum (
Id int,
Nome varchar(10),
Cognome varchar(10),
DataNascita datetime
);
CREATE TABLE dbo.Servizi (
Id int NOT NULL,
IdUtente int,
TipoServizio varchar(5),
Data datetime,
Sede varchar(5) DEFAULT 'a',
Operatore varchar(5) DEFAULT 'o'
);
GO
INSERT INTO dbo.Curriculum VALUES ( 1, 'Andrea', 'Montanari', '19651030' ); INSERT INTO dbo.Curriculum VALUES ( 2, 'Jampi', 'Coll', '19801001' ); INSERT INTO dbo.Curriculum VALUES ( 3, 'Pippo', 'Pippo', '19801001' );
INSERT INTO dbo.Servizi ( Id, IdUtente, TipoServizio, Data ) VALUES ( 1, 1, 'a', '20090919' );
INSERT INTO dbo.Servizi ( Id, IdUtente, TipoServizio, Data ) VALUES ( 2, 2, 'a', '20090915' );
INSERT INTO dbo.Servizi ( Id, IdUtente, TipoServizio, Data ) VALUES ( 3, 2, 'b', '20090910' );
GO
PRINT 'esplosione di join completa';
SELECT *
FROM dbo.Curriculum c
JOIN dbo.Servizi s
ON s.IdUtente = c.Id;
GO
PRINT 'recupero dei servizi di ogni utente con Data minima per ogni utente'; WITH cte AS (
SELECT c.Id,
(SELECT s.Id
FROM dbo.Servizi s
WHERE s.IdUtente = c.Id
AND s.Data = ( SELECT MIN(Data)
FROM dbo.Servizi s2
WHERE s2.IdUtente = c.Id
)
) AS [IdServizio]
FROM dbo.Curriculum c
)
SELECT c.*,
s.*
FROM dbo.Curriculum c
JOIN cte ON cte.Id = c.Id
JOIN dbo.Servizi s ON s.IdUtente = c.Id AND s.Id = cte.IdServizio; GO
PRINT 'recupero dei servizi di ogni utente con IdServizio minimo per ogni utente (che non ha molto senso)';
WITH cte AS (
SELECT c.Id,
(SELECT s.Id
FROM dbo.Servizi s
WHERE s.IdUtente = c.Id
AND s.Id = ( SELECT MIN(Id)
FROM dbo.Servizi s2
WHERE s2.IdUtente = c.Id
)
) AS [IdServizio]
FROM dbo.Curriculum c
)
SELECT c.*,
s.*
FROM dbo.Curriculum c
JOIN cte ON cte.Id = c.Id
JOIN dbo.Servizi s ON s.IdUtente = c.Id AND s.Id = cte.IdServizio; GO
PRINT 'recupero dell''informazione di esistenza servizi collegati'; SELECT c.*,
CASE WHEN EXISTS (SELECT 1
FROM dbo.Servizi s
WHERE s.IdUtente = c.Id) THEN 'Servizi collegati esistenti' ELSE 'n.a.'
END AS [ServiziCollegati]
FROM dbo.Curriculum c;
GO
DROP TABLE dbo.Curriculum, dbo.Servizi;
--<-------------
esplosione di join completa
Id Nome Cognome DataNascita Id IdUtente TipoServizio Data Sede Operatore ---------
--------
--------
---------------------
---------
---------
----------
---------------------
---
---------
1 Andrea Montanari 1965-10-30 00
0
0.000 1 1 a 2009-09-19 00
0
0.000 a o
2 Jampi Coll 1980-10-01 00
0
0.000 2 2 a 2009-09-15 00
0
0.000 a o
2 Jampi Coll 1980-10-01 00
0
0.000 3 2 b 2009-09-10 00
0
0.000 a o
recupero dei servizi di ogni utente con Data minima per ogni utente Id Nome Cognome DataNascita Id IdUtente TipoServizio Data Sede Operatore ---------
--------
--------
---------------------
---------
---------
----------
---------------------
---
---------
1 Andrea Montanari 1965-10-30 00
0
0.000 1 1 a 2009-09-19 00
0
0.000 a o
2 Jampi Coll 1980-10-01 00
0
0.000 3 2 b 2009-09-10 00
0
0.000 a o
recupero dei servizi di ogni utente con IdServizio minimo per ogni utente (che non ha molto senso)
Id Nome Cognome DataNascita Id IdUtente TipoServizio Data Sede Operatore ---------
--------
--------
---------------------
---------
---------
----------
---------------------
---
---------
1 Andrea Montanari 1965-10-30 00
0
0.000 1 1 a 2009-09-19 00
0
0.000 a o
2 Jampi Coll 1980-10-01 00
0
0.000 2 2 a 2009-09-15 00
0
0.000 a o
recupero dell'informazione di esistenza servizi collegati
Id Nome Cognome DataNascita ServiziCollegati ---------
--------
--------
---------------------
-------------------------
1 Andrea Montanari 1965-10-30 00
0
0.000 Servizi collegati esistenti
2 Jampi Coll 1980-10-01 00
0
0.000 Servizi collegati esistenti
3 Pippo Pippo 1980-10-01 00
0
0.000 n.a.
ripeto che non ha un senso in se, in quanto l'informazione non e' completa e quindi e' inesatta..
puo' avere senso dire che "l'utente X ha dei servizi collegati" (anche senza specificare quali), ma non che ha "questo" come "primo" servizio collegato in base all'attributo "Id" (o "data", o altro)..
o almeno, la logica che hai qui riportato non e' sufficiente alla bisogna.. saluti