2011-01-28 8 views
6

Bu çok basit olabilir, şu anda ağaçların ağaçlarını görmüyorum. Oracle'da, A tablosunun A tablosunun A tablosunun A tablosunun birincil anahtarına dayalı olarak kayıtları seçiyorum. Ancak, B tablosu, A tablosunun birincil anahtarıyla eşleşen birden çok kayda sahip olabilir. Bu, sorgunun yinelenen satırları tablodan döndürmesine neden oluyor.PL/SQL - Birleştirilmiş tablodan tek bir satır nasıl döndürülür

TableA    TableB 
_______    _________ 
1, Sec1    2, 11/01/2011 
2, Sec2    2 
3, Sec3    5, 10/01/2011 
4, Sec4    6, 10/01/2011 

Select A.SecID, A.SecName, B.DateSent from tableA A 
    inner join tableB B on A.SecID = B.SecID 

Bu Sec2 için 2 kayıtları dönüyor - ne kadar onu Sec2 için sadece 1 kayıt dönmek alabilirsiniz: Aşağıda A. benim sorgu sürümü aşağı bir kesim olduğunu? Farklı ve benzersiz kullanmaya çalıştım ama yine de aynı sonuçları aldım.

+0

Özür dilerim bunu daha önce basitleştirdim. Aslında B tablosundan bir tarih değerine de ihtiyacım var. –

+2

İki kayıttan hangisinin tarihi? – Quassnoi

+0

En son tarih olan tableB'deki kayıt. Bazı kayıtların bir tarih değeri olmayabilir. –

cevap

12
SELECT secid, secname 
FROM tableA 
WHERE secid IN 
     (
     SELECT secid 
     FROM tableb 
     ) 

siz de tableB bir rekor gerekirse: Eğer alacak b üzerinde birden kayıtların

SELECT secid, secname, datesent 
FROM (
     SELECT a.secid, a.secname, b.datesent, ROW_NUMBER() OVER (PARTITION BY a.secid ORDER BY b.datesent DESC) AS rn 
     FROM tableA a 
     JOIN tableB b 
     ON  b.secid = a.secid 
     ) 
WHERE rn = 1 

ORDER BY fıkra kontrolleri.

+0

hile yaptı güzel bir :) –

0
SELECT DISTINCT a.secid, a.secname 
    FROM tableA a, tableB b 
WHERE a.secid = b.secid; 
2

Yalnızca bir satırı seçmek için bir GRUP işlevini kullanabilirsiniz:

SELECT A.SecID, A.SecName, max(B.DateSent) DateSent 
    FROM tableA A 
    JOIN tableB B on A.SecID = B.SecID 
GROUP BY A.SecID, A.SecName 
+0

Merhaba @Vincent teşekkürler - Benim tam sorgu yaklaşık 40 alanları vardır, bu yüzden farklı bir yolu olmadığı sürece, Group By yanlışı için B.DateSent dışındaki tüm alanları eklemek anlamına gelir. –

+0

Çok fazla alanınız varsa, Quassnoi'nin çözümü kesinlikle bir yoldur. –

0

önerilen çözümler çok iyi. Tablolardan biri diğerine göre çok büyük olduğunda ve B tablosunda yabancı anahtar sütununda bir indeks bulunmadığında özel olarak biraz farklı bir yaklaşım alabileceğiniz durumlar vardır.