2011-01-28 57 views
6

這可能很簡單我目前沒有看到樹木。在Oracle中,我從表A中選擇記錄,根據表A的主鍵連接到表B.但是表B可以有多個記錄匹配表A的主鍵。這導致我的查詢從表中返回重複的行答:下面是我的查詢的削減版本:PL/SQL - 如何從連接表中返回單行

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 

這是返回2個記錄秒2 - 我怎樣才能得到它返回只有1個記錄秒2?我嘗試過使用獨特而獨特的方法,但仍得到相同的結果。

+0

道歉我最初簡化了這一點。我實際上還需要表B中的日期值 – 2011-01-28 14:42:22

+2

這兩個記錄中的哪一個的日期值? – Quassnoi 2011-01-28 14:47:25

+0

tableB中最近日期的記錄。某些記錄可能沒有日期值。 – 2011-01-28 14:51:25

回答

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

如果需要從tableB記錄以及:你會得到b其中的多個記錄

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條款管制。

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

您可以使用GROUP函數來僅選擇一個行:

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

提出的解決方案是非常好的。在某些情況下,如果其中一個表格非常大,而另一個表格中的外鍵列沒有索引,則可能採取了一些不同的方法。