2011-01-28 16 views
6

To może być całkiem proste Po prostu nie widzę teraz drzewa dla drzew. W Oracle wybieram rekordy z tabeli A, która łączy się z tabelą B na podstawie klucza podstawowego tabeli A. Jednak tabela B może zawierać wiele rekordów pasujących do klucza podstawowego tabeli A. Powoduje to, że moje zapytanie zwraca zduplikowane wiersze z tabeli A. Poniżej znajduje się obniżyć wersja mojego zapytania:PL/SQL - Jak zwrócić pojedynczy wiersz z połączonego stołu

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 

to jest powrót 2 rekordy Sec2 - jak mogę zmusić go do powrotu tylko 1 rekord Sec2? Próbowałem używać odrębne i unikalne, ale nadal uzyskać takie same wyniki.

+0

Przeprosiny I początkowo uprościłem to. Właściwie potrzebuję wartości daty z tabeli B oraz –

+2

Wartość daty z dwóch rekordów? – Quassnoi

+0

Rekord w tableB z najnowszą datą. Niektóre rekordy mogą nie mieć wartości daty. –

Odpowiedz

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

Jeśli potrzebujesz rekord z tableB, a także:

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 steruje klauzula, która z wielu rekordów na b dostaniesz.

+0

miło, że udało się :) –

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

Można użyć funkcji grupy, aby wybrać tylko jeden wiersz:

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

Cześć @Vincent dzięki - moje pełne zapytanie ma około 40 pól, więc oznacza to dodanie wszystkich pól oprócz B.DateSent do klauzuli Group By, chyba że jest inny sposób. –

+0

Jeśli masz dużo pól, rozwiązanie Quassnoi jest zdecydowanie najlepszą drogą. –

0

Zaproponowane rozwiązania są bardzo dobre. Zdarzają się przypadki, kiedy możesz podejść nieco inaczej, szczególnie gdy jedna z tabel jest bardzo duża w porównaniu z inną tabelą i brak indeksu w kolumnie klucza obcego w tabeli B.

Powiązane problemy