PL / SQL - 如何从连接表返回单行

时间:2011-01-28 14:28:22

标签: sql oracle plsql

这可能很简单,我现在还没有看到树木。在Oracle中,我从表A中选择基于表A的主键连接到表B的记录。但是,表B可以有多个与表A的主键匹配的记录。这导致我的查询从表中返回重复的行答:以下是我的查询的简化版本:

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

这将为Sec2返回2条记录 - 如何让它仅返回Sec2的1条记录?我尝试过使用独特而独特的但仍能得到相同的结果。

4 个答案:

答案 0 :(得分:12)

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

如果您还需要来自tableB的记录:

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子句控制b上的多个记录中的哪一个。

答案 1 :(得分: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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

建议的解决方案非常好。有些情况下,当其中一个表与另一个表相比非常大并且表B中的外键列没有索引时,您可能采取了一些不同的方法。