从结果表中多次选择到oracle中的单行

时间:2016-01-11 05:43:00

标签: sql oracle select join

我一直在努力寻找一种方法来在SQL命令中用内部选择替换多个JOIN,但到目前为止还没有找到。我有一个连接11个表的查询,由于多个角色,我的查询中必须有21个连接。所以我决定在我的表格中找到更多信息,并发现我有一张表格,其中包含与某些表格相关的正确信息。 [我的结果表] [1]
 你可以看到我有一个名为" Mainuuid"这与不同的" Slave"值。每个从属值都是其相对表中的主键。 所以我需要的是一行,它是根据结果图像从多个select中计算出来的,例如:我将结果表命名为" test"

  • SELECT a,b FROM person WHERE Id = test.slave,
  • SELECT x,y FROM Unit WHERE Id = test.slave,
  • SELECT o,p FROM naturalperson WHERE Id = test.slave

    我想把所有结果都放在一行!任何建议将不胜感激。

    [1]:http://i.stack.imgur.com/7pK2D.jpg

2 个答案:

答案 0 :(得分:0)

我真的没有理解为什么你真的需要用嵌套的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从同一行的所有表中获取结果。 这是一个快速的答案 - 可能不是解决方案,但我希望它至少可以帮助你前进。

答案 1 :(得分:0)

有更多方法可以实现这一目标,最简单的方法是:

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)

问题是,每个嵌套选择只能选择一个属性。 在Oracle可用的12C版本中,解决此问题的方法是OUTER APPLYCROSS APPLY

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 joinsWHERE ROWNUM=1代替FETCH FIRST 1 ROW ONLY