61 messaggi dal 02 luglio 2007
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
1.976 messaggi dal 27 luglio 2005
Contributi
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

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
61 messaggi dal 02 luglio 2007
 Grazie tante ma ho risolto con una istruzione except....
Ho selezionato tutti gli utenti e poi ho tolto quelli che avevano un profilo..
mi è andata bene... grazie ancora ciao

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.