salve,
marco.net wrote:
Salve.. ho fatto una st.proc. che recupera i dati da due tabelle legate da un join... volevo ora far vedere solo i record della prima tabella che non avessero rispettivi record nella seconda... Per completezza la prima tabella contiene utenti e la seconda un'associazione tra id utente e id profilo... dunque voglio mostrare utenti che non hanno un profilo.
Ho scritto :
SELECT tbUsers.UserID AS Expr1, tbUsers.Name, tbUsers.Surname, tbUsers.UserName, COUNT(*) AS Expr2
FROM tbUsers INNER JOIN
tbUserProfileAssociation ON tbUsers.UserID =
tbUserProfileAssociation.UserID
GROUP BY tbUsers.UserID, tbUsers.Name, tbUsers.Surname,
tbUsers.UserName HAVING (COUNT(*) = 0)
ma non funziona mentre se imposto il count a un altro numero va benissimo.. Come posso fare?
Grazie
non ho ben capito a cosa ti serva l'aggregazione.. se devi ritornare "l'elenco" degli utenti che non sono collegati ad un qualsiasi profilo ti e' sufficiente un right join sulla relazione filtrando per l'attributo derivato dall'esplosione in modo che questi sia NULL, tipicamente
SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.p (
Id int NOT NULL,
Data varchar(10) NOT NULL
);
CREATE TABLE dbo.u (
Id int NOT NULL,
IdP int NULL,
Data varchar(10) NOT NULL
);
GO
INSERT INTO dbo.p VALUES ( 1 , 'p1' );
INSERT INTO dbo.p VALUES ( 2 , 'p2' );
INSERT INTO dbo.p VALUES ( 3 , 'p3' );
INSERT INTO dbo.p VALUES ( 4 , 'p4' );
INSERT INTO dbo.u VALUES ( 1, 1, 'u-p1' );
INSERT INTO dbo.u VALUES ( 2, 2, 'u-p2.1' );
INSERT INTO dbo.u VALUES ( 3, 2, 'u-p2.2' );
INSERT INTO dbo.u VALUES ( 4, 3, 'u-p3.1' );
INSERT INTO dbo.u VALUES ( 5, 3, 'u-p3.2' );
INSERT INTO dbo.u VALUES ( 6, 3, 'u-p3.3' );
INSERT INTO dbo.u VALUES ( 7, 4, 'u-p3.1' );
INSERT INTO dbo.u VALUES ( 8, 4, 'u-p3.2' );
INSERT INTO dbo.u VALUES ( 9, 4, 'u-p3.3' );
INSERT INTO dbo.u VALUES ( 10, 4, 'u-p3.4' );
INSERT INTO dbo.u VALUES ( 11, NULL, 'u-p4.NULL' );
GO
PRINT 'recupero delle relazioni generali';
SELECT *
FROM dbo.p p
FULL OUTER JOIN dbo.u u
ON u.IdP = p.Id
PRINT 'recupero delle relazioni mancanti';
SELECT *
FROM dbo.p p
RIGHT JOIN dbo.u u
ON u.IdP = p.Id
WHERE p.Id IS NULL;
GO
DROP TABLE dbo.u, dbo.p;
--<----------
ecupero delle relazioni generali
Id Data Id IdP Data
---------
--------
---------
---------
----------
1 p1 1 1 u-p1
2 p2 2 2 u-p2.1
2 p2 3 2 u-p2.2
3 p3 4 3 u-p3.1
3 p3 5 3 u-p3.2
3 p3 6 3 u-p3.3
4 p4 7 4 u-p3.1
4 p4 8 4 u-p3.2
4 p4 9 4 u-p3.3
4 p4 10 4 u-p3.4
NULL NULL 11 NULL u-p4.NULL
recupero delle relazioni mancanti
Id Data Id IdP Data
---------
--------
---------
---------
----------
NULL NULL 11 NULL u-p4.NULL
mentre se vuoi l'aggregazione del relativo conteggio ti e' sufficiente PRINT 'recupero delle relazioni generali';
SELECT p.Id, COUNT(*) AS [Utenti relativi]
FROM dbo.p p
FULL OUTER JOIN dbo.u u
ON u.IdP = p.Id
GROUP BY p.Id;
PRINT 'recupero delle relazioni mancanti';
SELECT p.Id, COUNT(*) AS [Utenti orfani]
FROM dbo.p p
RIGHT JOIN dbo.u u
ON u.IdP = p.Id
WHERE p.Id IS NULL
GROUP BY p.Id;
o meglio ancora
SELECT COUNT(*) AS [Utenti orfani]
FROM dbo.p p
RIGHT JOIN dbo.u u
ON u.IdP = p.Id
WHERE p.Id IS NULL;
--<--------
recupero delle relazioni generali
Id Utenti relativi
---------
---------------
1 1
2 2
3 3
4 4
NULL 1
recupero delle relazioni mancanti
Id Utenti orfani
---------
-------------
NULL 1
Utenti orfani
-------------
1
saluti