36

サブクエリがOracleデータベースの複数の列を返すようにする方法はありますか?(この特定のSQLがエラーになることはわかっていますが、私が望むものをかなりうまくまとめています)

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

次のような結果が必要です。

a.x | b.y | b.z
---------------
1   | 2   | 3

結合によってこの問題を解決できることは知っていますが、それは私が求めていることではありません。

私の質問は、サブクエリから2つ以上の値を取得する方法があるかどうかということです。たぶん、デュアルを使用したいくつかの回避策はありますか?実際の結合はありませんが、各行に新しいサブクエリがありますか?

編集:これは主要な質問です。参加を使用してこれらすべての問題を解決することができます、私は知っています。このようなサブクエリはまったく必要ありません(1つの列に対しても)。しかし、彼らはそこにいます。それで、私はそれらをそのように使うことができますか、それとも単に不可能ですか?

4

7 に答える 7

23

正しくありませんが、代わりにこれを試すことができます。

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

結合でサブクエリを使用することもできます

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

また

   select
        a.x,
        b.y,
        b.z
    from a
    left join b on b.v = a.v
于 2012-09-18T08:08:43.450 に答える
23

Select句のサブクエリは、あなたの場合と同様に、スカラーサブクエリとも呼ばれます。これは、式の形式であることを意味します。1つの値しか返すことができないことを意味します。

恐れ入りますが、単一のスカラーサブクエリから複数の列を返すことはできません。

OracleScalarサブクエリの詳細は次のとおりです。

http://docs.oracle.com/cd/B19306_01/server.102/b14200/expressions010.htm#i1033549

于 2012-09-18T09:26:06.030 に答える
8

スカラーサブクエリ(またはインラインサブクエリ)で複数の列を取得し、ルックアップテーブルを1回だけクエリする2つの方法を次に示します。これは少し複雑ですが、特別な場合には非常に効率的です。

  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)
    

    リスト内の列に区切り文字が含まれていないことを確認する必要があります。

  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
    
于 2012-09-18T10:15:08.690 に答える
3

このようにJOINは使えませんか?

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

(私はOracle構文を知りません。それで私はSQL構文を書きました)

于 2012-09-18T08:10:24.590 に答える
2

Oracleクエリの場合

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

次のように変換できます:

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
)

テーブルAの重複を防ぎたい場合に便利です。同様に、テーブルの数を増やすことができます。

.... where (b1.rowid,c1.rowid) = (select b.rowid,c.rowid ....
于 2014-05-19T10:56:20.480 に答える
2

あなたが使用することができます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

bからmach行への行がない場合は、行を返しませcross applyん。そのような行が必要な場合は、outer apply

からの行ごとに特定の行を1つだけ見つける必要がある場合は、次のことを試してください。

    cross apply
    (   select top 1 b.y, b.z
        from b
        where b.v = a.v
        order by b.order
    ) bb
于 2017-06-20T12:11:53.683 に答える
1

このWebを表示する: http ://www.w3resource.com/sql/subqueries/multiplee-row-column-subqueries.php

使用例

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);    
于 2017-06-20T12:01:33.613 に答える