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

Posted

技术标签:

【中文标题】PL/SQL - 如何从连接表中返回单行【英文标题】:PL/SQL - How to return single row from a joined table 【发布时间】:2011-01-28 14:28:21 【问题描述】:

这可能很简单,我只是目前还没有看到树木的树木。在 Oracle 中,我从表 A 中选择记录,这些记录根据表 A 的主键连接到表 B。但是表 B 可以有多个与表 A 的主键匹配的记录。这导致我的查询从表中返回重复的行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 条记录?我尝试过使用 distinct 和 unique 但仍然得到相同的结果。

【问题讨论】:

抱歉,我最初简化了这个。我实际上也需要表 B 中的日期值 两条记录中哪一条的日期值? 表B中日期最近的记录。有些记录可能没有日期值。 【参考方案1】:
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 上的多条记录中的哪一条。

【讨论】:

【参考方案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

【讨论】:

嗨@Vincent 谢谢 - 我的完整查询有大约 40 个字段,所以这意味着将除 B.DateSent 之外的所有字段添加到 Group By 子句,除非有不同的方式。 如果你有很多领域,Quassnoi的解决方案绝对是要走的路。【参考方案3】:
SELECT DISTINCT a.secid, a.secname
  FROM tableA a, tableB b
 WHERE a.secid = b.secid;

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于PL/SQL - 如何从连接表中返回单行的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL ORA-01422 SELECT INTO 错误,Oracle 匿名块(NOVA 环境)

PL/SQL developer连接oracle出现“ORA-12154:TNS:could not resolve the connect identifier specified”问题的解决(代码

如何在选择语句的“NOT IN”子句中使用逗号分隔的字符串列表作为 pl/sql 存储的函数参数

如何从 Oracle PL/SQL 函数中返回现有表中的记录?

将PL/SQL代码封装在机灵的包中

Windows 64位 安装Oracle instantclient 官方绿色版和PL/SQL Developer 总结