|
|
Subject: record senza corrispondenza
From: Lorenzo Benaglia
Date: 5/11/2007 2:41:10 PM
piocanet wrote:
> Per un progetto devo recuperare tutte le righe di una tabella padre
> (clienti) che non hanno corrispondenza nella tabella figlio (fatture)
> Mi aiutate?
Ciao piocanet,
Puoi procedere in diversi modi:
USE tempdb;
/* Creo la tabella dbo.Students1 */
CREATE TABLE dbo.Students1(
StudentID int NOT NULL PRIMARY KEY,
FirstName varchar(10) NOT NULL,
LastName varchar(10) NOT NULL,
Age tinyint NOT NULL
);
/* Creo la tabella dbo.Students2 */
CREATE TABLE dbo.Students2(
StudentID int NOT NULL PRIMARY KEY,
FirstName varchar(10) NOT NULL,
LastName varchar(10) NOT NULL,
Age tinyint NOT NULL
);
/* Le popolo */
INSERT dbo.Students1 VALUES(1, 'Lorenzo', 'Benaglia', 31);
INSERT dbo.Students1 VALUES(2, 'Luca', 'Bianchi', 30);
INSERT dbo.Students1 VALUES(3, 'Gianluca', 'Hotz', 31);
INSERT dbo.Students2 VALUES(1, 'Lorenzo', 'Benaglia', 31);
INSERT dbo.Students2 VALUES(2, 'Luca', 'Bianchi', 30);
INSERT dbo.Students2 VALUES(4, 'Andrea', 'Montanari', 25);
/* Query: Restituisco gli studenti in dbo.Students1
** che non sono presenti in dbo.Students2
*/
/* Soluzione 1 */
SELECT S1.*
FROM dbo.Students1 AS S1
LEFT JOIN dbo.Students2 AS S2
ON S1.StudentID = S2.StudentID
WHERE S2.StudentID IS NULL;
/* Soluzione 2 */
SELECT *
FROM dbo.Students1
WHERE StudentID NOT IN(
SELECT StudentID
FROM dbo.Students2
);
/* Soluzione 3 */
SELECT *
FROM dbo.Students1 S1
WHERE NOT EXISTS(
SELECT *
FROM dbo.Students2 S2
WHERE S1.StudentID = S2.StudentID
);
/* Soluzione 4 (per SQL Server 2005) */
SELECT *
FROM dbo.Students1
EXCEPT
SELECT *
FROM dbo.Students2;
/* Output:
StudentID FirstName LastName Age
----------- ---------- ---------- ----
3 Gianluca Hotz 31
(1 row(s) affected)
*/
/* Pulizia */
DROP TABLE dbo.Students1, dbo.Students2;
Per comprendere a fondo le differenze, approfondisci i singoli comandi sui
Books Online.
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
|