복붙노트

[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 레벨 깊이의 중첩 제한이 있습니다.

    오라클의 최신 버전은 제한이 없지만 오라클 대부분의 이전 버전은 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. ==============================

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

    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);
    

    감사!

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