2013-02-11 14 views
5

Mam przykładową tabelę w następujący sposób.Oracle SQL select odrębny

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 

Chciałbym wybrać różne wpisy do kodu, a także ID i nazwę dla tych odrębnych wpisów. W powyższej tabeli chciałbym uzyskać następujące informacje (więc ignoruję adresy budynków).

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

To prawdopodobnie lewostronne połączenie, ale nie mogę go poprawnie złożyć (zwłaszcza, że ​​wybieram dane z tej samej tabeli). Czy ktoś ma pomysł na ten temat? Dzięki.

+0

dlaczego nie używasz odrębną nazwę, kod wtedy wewnętrzna przyłączyć do tej samej tabeli –

Odpowiedz

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

pełny kod jest 'SELECT id, nazwa, kod z budynków WHERE id IN (SELECT MIN (id) FROM tb_buildings GROUP BY Code) ' –

0

Spróbuj:

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

tej można użyć też:

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

widzę każdy odpowiedział już tego, ale dlaczego tak skomplikowane?

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

Może to pokazywać dane, które niekoniecznie istnieją w oryginale zestaw danych, np. jeśli MIN (ID) = 1 i MIN (NAZWA) pokazuje dane z wiersza, gdzie ID = 2. –

+0

Na podstawie przykładowego zestawu danych jest w porządku. W oparciu o prawdziwe dane, tak, prawdopodobnie jest niewystarczające. –

2

Są dwa sposoby, na które chciałbym to zrobić. Jednym z nich jest użycie funkcji agregującej FIRST (documented here). Składnia jest trochę mylące, ale powinien wykonać zadanie

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 

Druga metoda alternatywna że sugerowałbym się za pomocą funkcji ROW_NUMBER jak sugeruje @techdo, chociaż myślę, że trzeba usunąć nazwę z kolumny że odpowiedź i zamiast używać:

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