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 函数中返回现有表中的记录?
Windows 64位 安装Oracle instantclient 官方绿色版和PL/SQL Developer 总结