[SQL] 오라클의 일부 버전에 상관 하위 쿼리에 대한 중첩 제한이 있습니까?
SQL오라클의 일부 버전에 상관 하위 쿼리에 대한 중첩 제한이 있습니까?
여기에 당신이 내 질문을 이해하는 데 도움이 될 것입니다 코드입니다 :
create table con ( content_id number);
create table mat ( material_id number, content_id number, resolution number, file_location varchar2(50));
create table con_groups (content_group_id number, content_id number);
insert into con values (99);
insert into mat values (1, 99, 7, 'C:\foo.jpg');
insert into mat values (2, 99, 2, '\\server\xyz.mov');
insert into mat values (3, 99, 5, '\\server2\xyz.wav');
insert into con values (100);
insert into mat values (4, 100, 5, 'C:\bar.png');
insert into mat values (5, 100, 3, '\\server\xyz.mov');
insert into mat values (6, 100, 7, '\\server2\xyz.wav');
insert into con_groups values (10, 99);
insert into con_groups values (10, 100);
commit;
SELECT m.material_id,
(SELECT file_location
FROM (SELECT file_location
FROM mat
WHERE mat.content_id = m.content_id
ORDER BY resolution DESC) special_mats_for_this_content
WHERE rownum = 1) special_mat_file_location
FROM mat m
WHERE m.material_id IN (select material_id
from mat
inner join con on con.content_id = mat.content_id
inner join con_groups on con_groups.content_id = con.content_id
where con_groups.content_group_id = 10);
매개 변수로 쿼리의 끝 부분에 숫자 10을 고려하시기 바랍니다. 환언하면,이 값은 본 예에서 하드 코드; 그것은 입력에 따라 변경합니다.
내 질문은 : 왜 오류를받을 수 있나요
"M"."CONTENT_ID": invalid identifier
중첩, 상관 하위 쿼리 하시나요? 중첩 제한 어떤 종류가 있습니까? 이 하위 쿼리는 결과가 각 행에 대해 다를 수 있습니다 content_id가에 따라 변경되므로 결과 집합의 모든 행에 출마를 할 필요가있다. 어떻게 오라클과이 작업을 수행 할 수 있습니까?
아니 내가 오라클 토론을 대 SQL Server를 시작하기 위해 노력하고있어,하지만 난 SQL 서버 배경에서 와서 나는 다음, 해당 쿼리가 SQL 서버에 벌금을 실행 지적하고 싶은 것을 :
create table con ( content_id int);
create table mat ( material_id int, content_id int, resolution int, file_location varchar(50));
create table con_groups (content_group_id int, content_id int);
insert into con values (99);
insert into mat values (1, 99, 7, 'C:\foo.jpg');
insert into mat values (2, 99, 2, '\\server\xyz.mov');
insert into mat values (3, 99, 5, '\\server2\xyz.wav');
insert into con values (100);
insert into mat values (4, 100, 5, 'C:\bar.png');
insert into mat values (5, 100, 3, '\\server\xyz.mov');
insert into mat values (6, 100, 7, '\\server2\xyz.wav');
insert into con_groups values (10, 99);
insert into con_groups values (10, 100);
SELECT m.material_id,
(SELECT file_location
FROM (SELECT TOP 1 file_location
FROM mat
WHERE mat.content_id = m.content_id
ORDER BY resolution DESC) special_mats_for_this_content
) special_mat_file_location
FROM mat m
WHERE m.material_id IN (select material_id
from mat
inner join con on con.content_id = mat.content_id
inner join con_groups on con_groups.content_id = con.content_id
where con_groups.content_group_id = 10);
당신은 내가 오라클 9i의를 SQL 서버에서이 작업을 수행 할 수는 없지만 왜 나를 이해하는 데 도움이 바랍니다 수 있습니까? 중첩 제한이있는 경우, 어떻게이 루핑 및 / 또는 임시 테이블에 의지하지 않고 오라클에서 하나의 선택 쿼리에서 수행 할 수 있습니다?
해결법
-
==============================
1.오라클의 최신 버전은 제한이 없지만 오라클 대부분의 이전 버전은 1 레벨 깊이의 중첩 제한이 있습니다.
오라클의 최신 버전은 제한이 없지만 오라클 대부분의 이전 버전은 1 레벨 깊이의 중첩 제한이 있습니다.
이것은 모든 버전에서 작동합니다 :
SELECT ( SELECT * FROM dual dn WHERE dn.dummy = do.dummy ) FROM dual do
이 쿼리는 12C와 18C에서 작동하지만 10g 및 11g에서 작동하지 않습니다. (단,이 쿼리를 허용했다. 그리고 11g의이 동작을 가능하게하는 패치가 10g의 적어도 하나 개의 버전이 있습니다.)
SELECT ( SELECT * FROM ( SELECT * FROM dual dn WHERE dn.dummy = do.dummy ) WHERE rownum = 1 ) FROM dual do
필요한 경우 당신은 당신이 너무 SQL 서버에서 사용할 수있는 윈도우 기능이 제한을 (해결할 수 있습니다 :)
SELECT * FROM ( SELECT m.material_id, ROW_NUMBER() OVER (PARTITION BY content_id ORDER BY resolution DESC) AS rn FROM mat m WHERE m.material_id IN ( SELECT con.content_id FROM con_groups JOIN con ON con.content_id = con_groups.content_id WHERE con_groups.content_group_id = 10 ) ) WHERE rn = 1
-
==============================
2.@Quassnoi이 오라클 10에서 오라클 9에서의 경우와 ...
@Quassnoi이 오라클 10에서 오라클 9에서의 경우와 ...
나는 당신이 ((선택 *에서에서 (...)) * 선택))에서 선택 * 같은이있는 경우 작동 생각하지 않는다 그냥 TABLENAME 별칭 SELECT * FROM 곳 colName 사용 = (SomeTable SELECT * FROM 곳 someCol = (SomeTable SELECT * FROM는 여기서 x x.id = alias.col))
http://forums.oracle.com/forums/thread.jspa?threadID=378604 체크 아웃
-
==============================
3.Quassnoi는 중첩에 대한 내 질문에 대답하고 창 분석 기능을 제안하여 큰 전화를했다. 여기에 내가 필요로하는 정확한 쿼리는 다음과 같습니다
Quassnoi는 중첩에 대한 내 질문에 대답하고 창 분석 기능을 제안하여 큰 전화를했다. 여기에 내가 필요로하는 정확한 쿼리는 다음과 같습니다
SELECT m.material_id, m.content_id, (SELECT max(file_location) keep (dense_rank first order by resolution desc) FROM mat WHERE mat.content_id = m.content_id) special_mat_file_location FROM mat m WHERE m.material_id IN (select material_id from mat inner join con on con.content_id = mat.content_id inner join con_groups on con_groups.content_id = con.content_id where con_groups.content_group_id = 10);
감사!
from https://stackoverflow.com/questions/1233910/is-there-a-nesting-limit-for-correlated-subqueries-in-some-versions-of-oracle by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 나는 오류 "참조 제약 조건과 충돌 DELETE 문"을 가지고 (0) | 2020.05.05 |
---|---|
[SQL] 아마도 SQL 서버 PIVOT? (0) | 2020.05.05 |
[SQL] 일 / 월 / 년에 (DB 또는 출력) 변경 날짜 형식 - PHP MySQL을 (0) | 2020.05.05 |
[SQL] 는 JDBC 스펙 방지합니까 '?' 오퍼레이터 (인용 외부)로 사용되는? (0) | 2020.05.05 |
[SQL] 어떻게 테이블 별칭 이름은 성능에 영향을 미치는가? (0) | 2020.05.05 |