2011-09-17 17 views
19

Ho bisogno di interrogare una tabella per restituire le righe, ma non sono in grado di interrogare correttamente la tabella. Qui è la mia vista tabella:come selezionare le righe in base a valori distinti di A COLUMN solo

Id    MailId   EmailAddress   Name 
1     1    [email protected]    Mr. A 
2     1    [email protected]    Mr. B 
3     1    [email protected]    Mr. C 
4     1    [email protected]    Mr. D 
5     1    [email protected]    Mr. A 


6     2    [email protected]    Mr. E 
7     2    [email protected]    Mr. A 
8     3    [email protected]    Mr. F 
9     4    [email protected]    Mr. D 

10    5    [email protected]    Mr. F 
11    6    [email protected]    Mr. D 

Il set di risultati dovrebbe restituirla:

Id    MailId   EmailAddress   Name 
1     1    [email protected]    Mr. A 
2     1    [email protected]    Mr. B 
3     1    [email protected]    Mr. C 
4     1    [email protected]    Mr. D 

6     2    [email protected]    Mr. E 
8     3    [email protected]    Mr. F 

In altre parole: prima, voglio selezionare distinti indirizzi e-mail, e poi restituire le righe che contengono e- distinta indirizzi di posta

Nota: Utilizzare semplicemente la parola chiave "Distinto" non funzionerà qui, in quanto selezionerà righe distinte. Il mio requisito è selezionare indirizzi email distinti e quindi selezionare righe contenenti tali indirizzi.

Edit: Non posso usare il "Gruppo A" parola chiave o, perché per questo dovrò anche su Raggruppamento con ID (che è il PK) e facendo questo tornerà due file con gli stessi valori EmailAddress ma con diversi ID.

+1

perché non si utilizza solo GROUP BY EmailAddress ... se si raggruppa dal proprio PK, non farà nulla perché la chiave primaria è sempre univoca, quindi group by statement non farà nulla .. se si usa group by emailAddress ottieni gli stessi risultati che hai specificato ... – blejzz

+1

Sembra che tu voglia selezionare EmailAddress e Nome distinti e il primo Id corrispondente, MailId per questi due. È corretto? Sono anche curioso di sapere come utilizzare Id e MailId. –

+1

Il raggruppamento per chiave primaria non ha senso. Il raggruppamento rimuove i valori duplicati. Le chiavi primarie per definizione non possono avere duplicati. – Thilo

risposta

1

se non si vuole usare l'uso DISTINCT GROUP BY

SELECT * FROM myTABLE GROUP BY EmailAddress 
+0

vedere la mia domanda modificata. Grazie – user576510

+1

vedi il mio commento, la mia risposta restituisce i risultati che volevi. – blejzz

+13

restituisce errore Msg 8120, livello 16, stato 1, riga 1 La colonna "EmailContact.RowId" non è valida nell'elenco di selezione perché non è contenuta in una funzione di aggregazione o nella clausola GROUP BY. – user576510

41

Guardando l'output forse la seguente query può lavorare, fare un tentativo:

SELECT * FROM tablename 
WHERE id IN 
(SELECT MIN(id) FROM tablename GROUP BY EmailAddress) 

Ciò selezionare una sola riga per ogni distinto indirizzo email, la riga con il minimo id che è ciò che il tuo risultato sembra ritrarre

+0

Grazie! Non sono sicuro del motivo per cui questo non è contrassegnato come la risposta corretta –

+0

Penso che sia necessario includere il campo del nome, non solo l'indirizzo email, anche se non ne ha un esempio. – Beth

13

Prova questo: hai bisogno di un CTE (Common Table Expression) che partit ions (raggruppa) i tuoi dati per indirizzo e-mail distinto e ordina ciascun gruppo per ID, prima il più piccolo. Poi basta selezionare la prima voce per ogni gruppo - che dovrebbe darti quello che stai cercando:

;WITH DistinctMails AS 
(
    SELECT ID, MailID, EMailAddress, NAME, 
     ROW_NUMBER() OVER(PARTITION BY EMailAddress ORDER BY ID) AS 'RowNum' 
    FROM dbo.YourMailTable 
) 
SELECT * 
FROM DistinctMails 
WHERE RowNum = 1 

Questo funziona su SQL Server 2005 e recente (non accenniate quello versione voi sta utilizzando ...)

2

uso questo (si presuppone che il nome della tabella è emails):

select * from emails as a 
inner join 
(select EmailAddress, min(Id) as id from emails 
group by EmailAddress) as b 
on a.EmailAddress = b.EmailAddress 
and a.Id = b.id 

speranza questo aiuto ..

0

Non sono sicuro del tuo DBMS. Così, ho creato una tabella temporanea in Redshift e dalla mia esperienza, credo che questa domanda deve restituire ciò che si sta cercando:

select min(Id), distinct MailId, EmailAddress, Name 
    from yourTableName 
    group by MailId, EmailAddress, Name 

vedo che sto usando un GROUP BY clause ma ancora non avrò due file contro qualsiasi particolare MailId.

Problemi correlati