source

서브쿼리에서 여러 값을 얻을 수 있습니까?

bestscript 2023. 2. 22. 22:31

서브쿼리에서 여러 값을 얻을 수 있습니까?

서브쿼리에서 oracle db의 여러 열을 반환할 수 있는 방법이 있습니까? (이 특정 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

가입을 통해 이 문제를 해결할 수 있다는 것은 알지만, 제가 원하는 것은 그게 아닙니다.

제 질문은 단순히 서브쿼리에서 두 개 이상의 값을 얻는 방법이 있는지 여부입니다.듀얼을 사용하여 해결 방법을 찾아보는 것은 어떨까요?그러면 실제 결합이 아니라 각 행에 대해 새로운 서브쿼리가 생깁니다.

편집: 이것은 중요한 질문입니다.Join을 사용하면 이 모든 문제를 해결할 수 있습니다.이러한 서브쿼리는 전혀 필요 없습니다(한 컬럼에 대해서도 필요 없습니다).하지만 그들은 거기에 있다.그럼 그런 식으로 사용할 수 있는 건가요, 아니면 불가능한 건가요?

Select 절의 Subquery는 스칼라 Subquery라고도 하며, 이는 표현의 한 형태임을 의미합니다.즉, 1개의 값만 반환할 수 있습니다.

단일 스칼라 서브쿼리에서 여러 열을 반환할 수 없습니다.

Oracle Scalar Subqueries에 대한 자세한 내용은 다음과 같습니다.

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

틀렸습니다만, 대신 다음을 시도해 보십시오.

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

다음으로 스칼라 서브쿼리(또는 인라인서브쿼리)에서 2개 이상의 컬럼을 취득하는 방법과 룩업테이블을 1회만 쿼리하는 방법을 나타냅니다.이것은 약간 복잡하지만 특별한 경우에는 매우 효율적일 수 있습니다.

  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
    

JOIN 이렇게 하면 안 돼요?

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

(Oracle 구문은 모릅니다.SQL 구문을 작성했습니다.)

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 ....

사용할 수 있습니다.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

이 웹 사이트 보기: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);    

언급URL : https://stackoverflow.com/questions/12472792/is-it-possible-to-get-multiple-values-from-a-subquery