从结果表中多选到oracle中的单行
Posted
技术标签:
【中文标题】从结果表中多选到oracle中的单行【英文标题】:Multiple select from a result table into a single row in oracle 【发布时间】:2016-01-11 05:43:00 【问题描述】:我一直在努力寻找一种方法来用 SQL 命令中的内部选择替换多个 JOIN,但到目前为止还没有找到。我有一个连接 11 个表的查询,由于多个角色,我的查询中必须有 21 个连接。所以我决定在我的表格中找到更多信息,并发现我有一个表格,其中包含适当的信息来关联一些表格。 [我的结果表][1] 如您所见,我有一个名为“Mainuuid”的字段,它与不同的“从属”值相关。每个从属值都是其相对表中的主键。 所以我需要的是一个单行,它是根据结果图像从多项选择中计算出来的,例如:我将结果表命名为“test”
从 Id=test.slave 的人中选择 a,b, 从 ID=test.slave 的单元中选择 x,y,SELECT o,p FROM naturalperson WHERE Id=test.slave
我想将所有结果放在一行中!任何建议将不胜感激。
[1]:http://i.stack.imgur.com/7pK2D.jpg
【问题讨论】:
我认为这就像扫描行并从相对表中查找所需字段并将获取的列添加到结果中等等。 【参考方案1】:我真的不明白为什么你真的需要用嵌套的 SELECT 替换连接,但这是我的建议:
SELECT x.mainuuid, max(x.a),max(x.b),max(y.x),max(y.y),max(z.o),max(z.p)
FROM
(SELECT mainuuid, a,b
FROM person, test
WHERE Id=test.slave) x
(SELECT mainuuid, x,y
FROM Unit, test
WHERE Id=test.slave) y
(SELECT mainuuid, o,p
FROM naturalperson, test
WHERE Id=test.slave) z
WHERE x.mainuuid = y.mainuuid(+)
AND x.mainuuid = z.mainuuid(+)
GROUP BY x.mainuuid;
我没有时间对此进行测试,但重点是,您使用 max 函数来消除空值并根据 mainuuid 从同一行的所有表中获取结果。 这是一个快速的答案 - 可能不是解决方案,但我希望它至少可以帮助您前进。
【讨论】:
我试过了,但你知道在第二次选择后,表格彼此不相关!第一个 FROM 发生在第一张桌子上,而不是其他人! 好的 - 我想我不明白你的问题。 :// 我要澄清一件事:您不能在不进行联接的情况下从多个表中选择数据。如果您忽略连接,数据库将进行交叉连接。【参考方案2】:有更多方法可以实现,最直接的方法是:
SELECT (SELECT a FROM person WHERE Id=test.slave FETCH FIRST 1 ROW ONLY),
(SELECT x FROM Unit WHERE Id=test.slave FETCH FIRST 1 ROW ONLY),
(SELECT o FROM naturalperson WHERE Id=test.slave FETCH FIRST 1 ROW ONLY)
问题是,每个嵌套选择只能选择一个属性。
解决这个问题的方法是 OUTER APPLY
或 CROSS APPLY
,在 Oracle 版本 12C 中可用。
SELECT p.a, p.b, u.*, n.*
FROM person p
OUTER APPLY (
SELECT u1.x,u1.y FROM Unit u1 WHERE u1.Id=p.Id FETCH FIRST 1 ROW ONLY) u
OUTER APPLY (
SELECT n1.o,n1.p FROM naturalperson n1 WHERE n1.Id=p.Id FETCH FIRST 1 ROW ONLY) n
WHERE p.Id=test.slave
对于旧版本的 Oracle,请使用 Lateral joins 和 WHERE ROWNUM=1
而不是 FETCH FIRST 1 ROW ONLY
。
【讨论】:
以上是关于从结果表中多选到oracle中的单行的主要内容,如果未能解决你的问题,请参考以下文章