有没有办法让子查询在oracle db中返回多个列?(我知道这个特定的sql会导致错误,但它总结了我想要的东西)
select
a.x,
( select b.y, b.z from b where b.v = a.v),
from a
Run Code Online (Sandbox Code Playgroud)
我想要一个这样的结果:
a.x | b.y | b.z
---------------
1 | 2 | 3
Run Code Online (Sandbox Code Playgroud)
我知道通过连接可以解决这个问题,但这不是我要求的.
我的问题很简单,如果有任何方法,从子查询中获得两个或更多的值?也许使用双重解决方法?这样就没有实际的连接,但每行都有一个新的子查询?
编辑:这是一个主要问题.你知道,你可以使用join解决所有这些问题.您根本不需要这样的子查询(甚至不需要一列).但他们在那里.那么我可以这样使用它们还是根本不可能?
Rob*_*ert 19
这是不正确的,但您可以尝试:
select
a.x,
( select b.y from b where b.v = a.v) as by,
( select b.z from b where b.v = a.v) as bz
from a
Run Code Online (Sandbox Code Playgroud)
你也可以在join中使用子查询
select
a.x,
b.y,
b.z
from a
left join (select y,z from b where ... ) b on b.v = a.v
Run Code Online (Sandbox Code Playgroud)
要么
select
a.x,
b.y,
b.z
from a
left join b on b.v = a.v
Run Code Online (Sandbox Code Playgroud)
Hen*_*ine 18
Select子句中的子查询(在您的情况下)也称为标量子查询,这意味着它是表达式的一种形式.这意味着它只能返回一个值.
我担心你不能从单个Scalar子查询中返回多个列,没有.
以下是有关Oracle标量子查询的更多信息:
http://docs.oracle.com/cd/B19306_01/server.102/b14200/expressions010.htm#i1033549
以下两种方法可以在标量子查询(或内联子查询)中获取多个列,并仅查询查询表一次.这有点令人费解,但在某些特殊情况下可能非常有效.
SELECT x,
regexp_substr(yz, '[^^]+', 1, 1) y,
regexp_substr(yz, '[^^]+', 1, 2) z
FROM (SELECT a.x,
(SELECT b.y || '^' || b.z yz
FROM b
WHERE b.v = a.v)
yz
FROM a)
Run Code Online (Sandbox Code Playgroud)
您需要确保列表中没有列包含分隔符.
您还可以使用SQL对象:
CREATE OR REPLACE TYPE b_obj AS OBJECT (y number, z number);
SELECT x,
v.yz.y y,
v.yz.z z
FROM (SELECT a.x,
(SELECT b_obj(y, z) yz
FROM b
WHERE b.v = a.v)
yz
FROM a) v
Run Code Online (Sandbox Code Playgroud)