186 messaggi dal 25 maggio 2007
Ciao a tutti ho un piccolo problema.
lavoro su due tabelle:
Tabella curriculum: id--nome-cognome-datanascita--ecc...
Tabella Servizi: id--id.utente--tipoServizio--data--sede-operatore

Ci può essere il caso in cui l'utente usufruisce di più servizi diversi quindi se faccio questa selezione:

SELECT DISTINCT curriculum.idUtente, curriculum.nome, curriculum.cognome, curriculum.gNascita, curriculum.mNascita, curriculum.aNascita, curriculum.luogoNascita, registrazione.data, registrazione.tipoServizio, registrazione.sede, registrazione.operatore FROM curriculum INNER JOIN registrazione ON curriculum.idUtente = registrazione.idUtente

Ottengo due righe con lo stesso utente con i servizi diversi.
Come posso fare per avere una sola riga per ogni utente con soltanto il primo servizio che trova nella selezione.
In teoria il DISTINCT dovrebbe essere ristretto alla tabella Curriculum.

Per favore aiutatemi, Grazie
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
jampicoll wrote:
Ciao a tutti ho un piccolo problema.
lavoro su due tabelle:
Tabella curriculum: id--nome-cognome-datanascita--ecc...
Tabella Servizi: id--id.utente--tipoServizio--data--sede-operatore
Ci può essere il caso in cui l'utente usufruisce di più servizi diversi quindi se faccio questa selezione:

SELECT DISTINCT curriculum.idUtente, curriculum.nome,
curriculum.cognome, curriculum.gNascita, curriculum.mNascita, curriculum.aNascita, curriculum.luogoNascita, registrazione.data, registrazione.tipoServizio, registrazione.sede,
registrazione.operatore FROM curriculum INNER JOIN registrazione ON curriculum.idUtente = registrazione.idUtente

Ottengo due righe con lo stesso utente con i servizi diversi. Come posso fare per avere una sola riga per ogni utente con soltanto il primo servizio che trova nella selezione.
In teoria il DISTINCT dovrebbe essere ristretto alla tabella Curriculum.

Per favore aiutatemi, Grazie

semanticamente non ha alcun senso ed e' un'informazione sbagliata, visto che ce ne sono "n" e non 1, quindi, in base a quale regola scegli tra gli eventuali "n" servizi collegati ad ogni curricula?
il "caso" non e' una "regola"

inoltre, che dbms stai utilizzando?
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
186 messaggi dal 25 maggio 2007
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.
1.976 messaggi dal 27 luglio 2005
Contributi
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

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.