我一直在努力寻找一种方法来在SQL命令中用内部选择替换多个JOIN,但到目前为止还没有找到。我有一个连接11个表的查询,由于多个角色,我的查询中必须有21个连接。所以我决定在我的表格中找到更多信息,并发现我有一张表格,其中包含与某些表格相关的正确信息。 [我的结果表] [1]
你可以看到我有一个名为" Mainuuid"这与不同的" Slave"值。每个从属值都是其相对表中的主键。
所以我需要的是一行,它是根据结果图像从多个select中计算出来的,例如:我将结果表命名为" test"
SELECT o,p FROM naturalperson WHERE Id = test.slave
我想把所有结果都放在一行!任何建议将不胜感激。
答案 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 APPLY
或CROSS 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 joins和WHERE ROWNUM=1
代替FETCH FIRST 1 ROW ONLY
。