是否可以从子查询中获取多个值?

Joh*_*ith 31 sql oracle

有没有办法让子查询在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


Vin*_*rat 7

以下两种方法可以在标量子查询(或内联子查询)中获取多个列,并仅查询查询表一次.这有点令人费解,但在某些特殊情况下可能非常有效.

  1. 您可以使用串联来一次获取多个列:

    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)

    您需要确保列表中没有列包含分隔符.

  2. 您还可以使用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)