2013-02-11 29 views
5

Aşağıdaki gibi bir örnek tablom var.Oracle SQL ayrı ayrı seç

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 

Bu farklı girişler için ayrı Kod girişlerinin yanı sıra Kimlik ve Ad'ı seçmek istiyorum. Yukarıdaki tablo için aşağıdakileri almak istiyorum (bu yüzden bina adreslerini görmezden geliyorum).

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

O (aynı tablodan veri seçerek ediyorum çünkü) bir Sol Üyelik ama düzgün bir araya getirmek için görünmüyor olabilir muhtemelen. Bunun hakkında bir fikri olan var mı? Teşekkürler.

+0

, kod sonra iç aynı masada –

cevap

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

katılmak zorunda tam kodu (WHERE id MIN SEÇ (IN 'id SEÇ kimliği, ad, binalar GELEN kodudur) Tb_buildings GROUP BY BY BY)) –

0

deneyin: Ben herkes zaten bu cevap vardır görüyorum ama neden bu kadar karmaşık

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

da bu birini kullanabilirsiniz?

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

:

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

Bu, orijinal olarak bulunmayan verileri gösterebilir. veri seti, ör. MIN (ID) = 1 ve MIN (NAME), ID = 2 olan satırdaki verileri gösterirse. –

+0

Örnek veri kümesine bağlı olarak, bu doğrudur. Gerçek verilere dayanarak, evet muhtemelen yetersiz. –

2

Bunu yaparken bakmanın iki yolu vardır. Biri, FIRST toplama işlevini (documented here) kullanmaktır. sözdizimi biraz kafa karıştırıcı ama işi yapmalıyım

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 

@techdo önerdiği gibi ben sizden ADI sütunu kaldırmak gerekir düşünüyorum rağmen, ROW_NUMBER fonksiyonunu kullanıyor öneririm diğer alternatif yöntem bu cevap ve bunun yerine kullanın: neden farklı isim kullanmıyor

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