2013-02-11 24 views
5

Ho una tabella di esempio come segue.Oracle SQL select distinct

ID  Name   Code  Address 
----+---------------+--------+---------------- 
1 | Sydney Hall | SH | 11 Abc Street 
2 | Sydney Hall | SH | 23 Abc Street 
3 | Main Hall | MH | 74 Xyz Street 
4 | Odyssey Hall | OH | 133 AbZ Street 
5 | Odyssey Hall | OH | 28 Xyx Street 

Desidero selezionare voci di codice distinte nonché ID e Nome per queste voci distinte. Per la tabella sopra vorrei avere il seguente (quindi sto ignorando gli indirizzi di costruzione).

ID  Name   Code 
----+---------------+--------+ 
1 | Sydney Hall | SH 
3 | Main Hall | MH 
4 | Odyssey Hall | OH 

E 'probabilmente Registrazione una sinistra, ma io non riesco a mettere insieme correttamente (in particolare dal momento che sto selezionando i dati dalla stessa tabella). Qualcuno ha un'idea al riguardo? Grazie.

+0

perché non si utilizza il nome distinto, il codice poi hanno join interno alla stessa tavola –

risposta

2
SELECT * 
FROM [table_1] 
WHERE [ID] IN (SELECT Min([ID]) 
       FROM [table_1] 
       GROUP BY CODE 
      ) 
+1

Il codice completo è 'SELECT id, nome, codice dagli edifici WHERE id IN (SELECT MIN (id) FROM tb_buildings GROUP BY Code) ' –

0

Si prega di provare:

SELECT * FROM(
    SELECT 
     ROW_NUMBER() over (partition by NAME, CODE order by NAME, CODE) RNUM, 
     ID, 
     NAME, 
     CODE, 
     ADDRESS 
    FROM YourTABLE 
)x where RNUM=1; 
0

È possibile utilizzare anche questo:

SELECT ID, Name, Code 
FROM table 
WHERE ID IN (SELECT Max(ID) 
      FROM table 
      GROUP BY Code 
      ) 
4

vedo tutti hanno già risposto a questo, ma perché così complicato?

SELECT 
MIN(ID) ID, 
MIN(NAME) NAME, 
CODE 
FROM TABLE 
GROUP BY CODE 
+0

Questo potrebbe mostrare dati che non esistono necessariamente nell'originale set di dati, ad es. se MIN (ID) = 1 e MIN (NAME) mostra i dati dalla riga dove ID = 2. –

+0

In base al set di dati campione va bene. Sulla base di dati reali, sì, probabilmente non è sufficiente. –

2

Ci sono due modi in cui vorrei fare questo. Uno è quello di utilizzare la funzione di aggregazione FIRST (documented here). La sintassi è un po 'di confusione ma dovrebbe fare il lavoro

Select 
    MIN(ID) keep (dense_rank first order by id) as id, 
    MIN(NAME) keep (dense_rank first order by id) as name, 
    CODE 
FROM YOUR_TABLE 
GROUP BY CODE 

L'altro metodo alternativo che vorrei suggerire è usare la funzione ROW_NUMBER come suggerito da @techdo, anche se credo che si avrebbe bisogno di rimuovere la colonna NOME da quella risposta e di utilizzare invece:

SELECT * FROM(
    SELECT 
     ROW_NUMBER() over (partition by CODE order by ID) RNUM, 
     ID, 
     NAME, 
     CODE 
    FROM YOUR_TABLE 
)x where RNUM=1;