2009-11-03 2 views
5

일부 Oracle SQL 쿼리를 (이론적으로) 모든 SQL 데이터베이스와 함께 작동하도록 변환하려고합니다. 일부 질의는 본질적으로 계층 적이며 CONNECT BY를 사용하여 작성됩니다.CONNECT BY에 대한 표준 대안?

오라클의 WITH WITH ... CONNECT BY 구문 대신 표준 SQL을 사용할 수 있습니까? 또는 계층 적 쿼리를 변환하기 위해 따라야하는 몇 가지 권장 프로세스가 있습니까?

+0

적어도 SQL Server, MySQL, Postgres는 다릅니다. –

답변

6

오라클 11g2에서는 공통 테이블 표현식 (대부분의 오라클 사람들이 하위 쿼리 인수 분해로 알고있는 것, 즉 WITH 절)에서 재귀를 지원합니다. 이것은 ANSI 방식의 일이므로 더 이식성이 있어야합니다.

Tom Kyte는 November 09 edition of Oracle magazine에 재귀 하위 쿼리 인수에 대해 씁니다.

+0

AFAIK : SQL Server, Oracle 및 DB2는 WITH 절을 지원하는 유일한 데이터베이스입니다. 나는 DB2의 버전이 재귀를 지원하는지 모르겠다. –

2

재귀 하위 쿼리 인수 (APC's answer 참조)를 지원하지 않는 데이터베이스에 대해 계층 적 쿼리가 필요한 경우 가장 낮은 기술 대안 중 하나는 계층을 별도의 키로 인코딩하는 것입니다. 물론 이것은 테이블 업데이트 프로세스를 제어하고 상위 업데이트 후에 키를 다시 작성할 수있는 경우에만 작동합니다.

예를 들어

:

FLAT_HIER_ID NODE_ID PARENT_NODE_ID 
~N1   N1 
~N1~N2  N2  N1 
~N1~N2~N3  N3  N2 
~N1~N2~N4  N4  N2 

하지 매우 우아하지만 쿼리 당신에게 경로를 제공합니다.

"중첩 세트 모델"방법을 사용하는 것이 더 좋은 옵션입니다. 이것은 Fogbugz에서 MSSQL, MySQL 및 MS Access에서 하위 쿼리를 처리하는 데 사용되는 방법입니다.

모델은에 설명되어 있습니다 :

http://www.developersdex.com/gurus/articles/112.asp

Fogbugz에있는 방법의 사용에 설명되어 있습니다 :

나는 '어떤 ANSI 계층 적 쿼리 구문이 없다

http://www.fogcreek.com/FogBugz/blog/post/Subcases-and-Hierarchy.aspx