서브쿼리에서 여러 값을 얻을 수 있습니까?
서브쿼리에서 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회만 쿼리하는 방법을 나타냅니다.이것은 약간 복잡하지만 특별한 경우에는 매우 효율적일 수 있습니다.
연결을 사용하여 한 번에 여러 열을 가져올 수 있습니다.
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)목록에서 구분 문자를 포함하는 열이 없는지 확인해야 합니다.
-
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
'source' 카테고리의 다른 글
| Angular ui-router : URL을 변경하지 않고 상태를 변경할 수 있습니까? (0) | 2023.02.22 |
|---|---|
| woocommerce.css를 덮어쓰는 최선의 방법 (0) | 2023.02.22 |
| React 앱에 Redx를 언제 추가해야 합니까? (0) | 2023.02.22 |
| Reactjs에서의 간단한 조건부 라우팅 (0) | 2023.02.22 |
| AngularJS POST 실패: 프리플라이트 응답에 비활성 HTTP 상태 코드 404가 있습니다. (0) | 2023.02.22 |