>Avrei necessità di ottenere, per ogni cliente nella tabella Clienti,
>una riga con i dati della tabella Abbonamenti relativi alla riga
>associata al cliente ed avente il codice Abbonamenti più alto...considerando
>che nella tabella abbonamenti posso avere più di una riga per
>ogni singolo cliente.
>Potete consigliarmi come fare in una unica istruzione di SELECT
>?
Ciao,
Osserva il seguente esempio:
USE tempdb;
CREATE TABLE dbo.Clienti(
Codice int NOT NULL PRIMARY KEY,
Nome varchar(10) NOT NULL,
Cognome varchar(10) NOT NULL
);
CREATE TABLE dbo.Abbonamenti(
Codice int NOT NULL PRIMARY KEY,
DataInizio date NOT NULL,
DataFine date NOT NULL,
NumIngressi int NOT NULL,
CodiceCliente int NOT NULL,
CONSTRAINT FK_Abbonamenti_Clienti FOREIGN KEY(CodiceCliente)
REFERENCES dbo.Clienti(Codice)
);
INSERT dbo.Clienti
VALUES (1, 'Lorenzo', 'Benaglia')
, (2, 'David', 'De Giacomi')
, (3, 'Alessandro', 'Alpi');
INSERT dbo.Abbonamenti
VALUES (10, '20120101', '20150101', 100, 1)
, (20, '20120202', '20150202', 200, 1)
, (30, '20120303', '20150303', 300, 3);
WITH CTE_GetKey(CodiceAbbonamento, CodiceCliente) AS
(
SELECT MAX(Codice), CodiceCliente
FROM dbo.Abbonamenti
GROUP BY CodiceCliente
)
SELECT C.*, A.*
FROM dbo.Abbonamenti AS A
JOIN CTE_GetKey AS K
ON A.Codice = K.CodiceAbbonamento
AND A.CodiceCliente = K.CodiceCliente
JOIN dbo.Clienti AS C
ON K.CodiceCliente = C.Codice
ORDER BY C.Codice;
/* Output:
Codice Nome Cognome Codice DataInizio DataFine NumIngressi CodiceCliente
----------- ---------- ---------- ----------- ---------- ---------- ----------- -------------
1 Lorenzo Benaglia 20 2012-02-02 2015-02-02 200 1
3 Alessandro Alpi 30 2012-03-03 2015-03-03 300 3
(2 row(s) affected)
*/
DROP TABLE dbo.Abbonamenti, dbo.Clienti;
>Grazie
Prego.
Ciao!
--
Lorenzo Benaglia
http://blogs.dotnethell.it/lorenzo/