2014-11-19 11 views
6

Ho la seguente query:SELECT restituisce distinte duplica

SELECT 
DISTINCT (TK.TICKETID), 
TK.DESCRIPTION, 
TK.CREATIONDATE, 
TK.REPORTEDBY, 
TK.OWNER, 
WF.ASSIGNCODE 
FROM ticket TK 
INNER JOIN wfassignment WF on WF.OWNERID = TK.TICKETUID 
WHERE TK.status not in ('ЧЕРНОВИК', 'ЗАКРЫТ', 'ВЫПОЛНЕН') AND WF.ASSIGNSTATUS not in ('COMPLETE', 'INACTIVE') 
ORDER BY TK.TICKETID; 

ma restituisce duplicati nell'attributo TK.TICKETID. E se rimuovo gli altri attributi tutto ok. ad es.

TK.TICKETID TK.DESCRIPTION TK.CREATIONDATE TK.REPORTEDBY TK.OWNER  WF.ASSIGNCODE 
О1013249 Право доступа 02.06.14  CHERNOVDK  SKACHKOVSV NOVIKOVVA 
О1013249 Право доступа 02.06.14  CHERNOVDK  SKACHKOVSV PRITULADV 
О1013249 Право доступа 02.06.14  CHERNOVDK  SKACHKOVSV SVESHNIKOVAV 

M.b. la mia domanda è semplice ma non posso risolverlo da solo. Sarà grande per qualsiasi tipo di aiuto.

+6

'DISTINCT' è *** NON *** una funzione. Funziona sempre su ** tutte ** le colonne della riga. Btw: quale DBMS stai usando? Postgres? Oracolo? –

+1

hanno codici di assegnazione diversi – Milen

+0

qual è il risultato di output desiderato? – Horaciux

risposta

3

Prova questo:

SELECT 
TK.TICKETID, 
TK.DESCRIPTION, 
TK.CREATIONDATE, 
TK.REPORTEDBY, 
TK.OWNER, 
max(WF.ASSIGNCODE) 
FROM ticket TK 
INNER JOIN wfassignment WF on WF.OWNERID = TK.TICKETUID 
WHERE TK.status not in ('ЧЕРНОВИК', 'ЗАКРЫТ', 'ВЫПОЛНЕН') AND WF.ASSIGNSTATUS not in ('COMPLETE', 'INACTIVE') 
group by 
TK.TICKETID, 
TK.DESCRIPTION, 
TK.CREATIONDATE, 
TK.REPORTEDBY, 
TK.OWNER 
ORDER BY TK.TICKETID; 
+0

Grazie mille, funziona! – Cove

+0

Puoi spiegare un po 'perché questo funziona? Ho sql simile ma max() non funziona nel mio caso. – James

+0

@James, per favore pubblica la tua domanda – Horaciux

1

Ci sono più colonne nella query di selezione, il controllo della query per l'univocità su tutte le colonne, non solo quella tra parentesi.

La parola chiave SQL DISTINCT viene utilizzata insieme all'istruzione SELECT per eliminare tutti i record duplicati e recuperare solo record univoci.. Si prega di notare che non solo le colonne

Se si modifica la query a questo:

SELECT 
DISTINCT (TK.TICKETID), 
TK.DESCRIPTION, 
TK.CREATIONDATE, 
TK.REPORTEDBY, 
TK.OWNER 
FROM ticket TK 
INNER JOIN wfassignment WF on WF.OWNERID = TK.TICKETUID 
WHERE TK.status not in ('ЧЕРНОВИК', 'ЗАКРЫТ', 'ВЫПОЛНЕН') AND WF.ASSIGNSTATUS not in ('COMPLETE', 'INACTIVE') 
ORDER BY TK.TICKETID; 

Si otterrà un solo risultato.

Nell'output, tenere presente quanto segue, quelli a stella sono tutti diversi.

TK.TICKETID TK.DESCRIPTION TK.CREATIONDATE TK.REPORTEDBY TK.OWNER  **WF.ASSIGNCOD**E 
О1013249 Право доступа 02.06.14  CHERNOVDK  SKACHKOVSV **NOVIKOVVA** 
О1013249 Право доступа 02.06.14  CHERNOVDK  SKACHKOVSV **PRITULADV** 
О1013249 Право доступа 02.06.14  CHERNOVDK  SKACHKOVSV **SVESHNIKOVAV** 
+0

Questo è il risultato giusto, ma perdiamo l'attributo WF.ASSIGNCODE. E nella soluzione di Horaciux tutto ok. Grazie per l'aiuto. – Cove

+0

@Cove L'idea era di aiutarti a capire il concetto, non esattamente a darti la soluzione. :) –

+0

Capisco ora dopo tutti i commenti che DISTINCT non funzionerà nel modo che volevo. La funzione di aggregazione e Group By è davvero la soluzione più semplice, ma la funzione ROWNUM è piuttosto interessante in Oracle, inoltre, saranno i miei compiti. – Cove