Is it possible to get multiple values from a subquery?

后端 未结 7 763
無奈伤痛
無奈伤痛 2021-02-06 22:49

Is there any way to have a subquery return multiple columns in oracle db? (I know this specific sql will result in an error, but it sums up what I want pretty well)



        
相关标签:
7条回答
  • 2021-02-06 23:03

    Here are two methods to get more than 1 column in a scalar subquery (or inline subquery) and querying the lookup table only once. This is a bit convoluted but can be the very efficient in some special cases.

    1. You can use concatenation to get several columns at once:

      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)
      

      You would need to make sure that no column in the list contain the separator character.

    2. You could also use SQL objects:

      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
      
    0 讨论(0)
  • 2021-02-06 23:05

    It's incorrect, but you can try this instead:

    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
    

    you can also use subquery in join

     select
            a.x,
            b.y,
            b.z
        from a
        left join (select y,z from b where ... ) b on b.v = a.v
    

    or

       select
            a.x,
            b.y,
            b.z
        from a
        left join b on b.v = a.v
    
    0 讨论(0)
  • 2021-02-06 23:05

    you can use cross apply:

    select
        a.x,
        bb.y,
        bb.z
    from
        a
        cross apply
        (   select b.y, b.z
            from b
            where b.v = a.v
        ) bb
    

    If there will be no row from b to mach row from a then cross apply wont return row. If you need such a rows then use outer apply

    If you need to find only one specific row for each of row from a, try:

        cross apply
        (   select top 1 b.y, b.z
            from b
            where b.v = a.v
            order by b.order
        ) bb
    
    0 讨论(0)
  • 2021-02-06 23:11

    In Oracle query

    select a.x
                ,(select b.y || ',' || b.z
                    from   b
                    where  b.v = a.v
                    and    rownum = 1) as multple_columns
    from   a
    

    can be transformed to:

    select a.x, b1.y, b1.z
    from   a, b b1
    where  b1.rowid = (
           select b.rowid
           from   b
           where  b.v = a.v
           and    rownum = 1
    )
    

    Is useful when we want to prevent duplication for table A. Similarly, we can increase the number of tables:

    .... where (b1.rowid,c1.rowid) = (select b.rowid,c.rowid ....
    
    0 讨论(0)
  • View this web: http://www.w3resource.com/sql/subqueries/multiplee-row-column-subqueries.php

    Use example

    select ord_num, agent_code, ord_date, ord_amount  
    from orders  
    where(agent_code, ord_amount) IN  
    (SELECT agent_code, MIN(ord_amount)  
    FROM orders   
    GROUP BY agent_code);    
    
    0 讨论(0)
  • 2021-02-06 23:23

    Can't you use JOIN like this one?

    SELECT
    a.x , b.y, b.z 
    FROM a 
    LEFT OUTER JOIN b ON b.v = a.v
    

    (I don't know Oracle Syntax. So I wrote SQL syntax)

    0 讨论(0)
提交回复
热议问题