2015-11-09 6 views
1

Мой вопрос может быть непростым для эксперта sql. Я хочу переписать свой sql как ansi-sql. Как я могу изменить ниже sql на ansi-sql в Oracle?Как сделать код pl/sql для Ansi-Sql?

select * 
from TEST r 
start with [email protected] 
connect by prior r.PARENTID=r.childid and r.recordstatus=1 
+0

'@ CHILDID' не является допустимым PL/SQL ссылка на переменную. Где и как вы выполняете это утверждение? –

+0

Вы уверены, что используете Oracle RDBMS, а не SQL Server. –

+0

Я использую Oracle RDBMS – Penguen

ответ

1

SQL-эквивалент ANSI будет рекурсивным общее табличное выражение:

with recursive tree as (
    select * 
    from test 
    where childid = .... --<< this is the START WITH part 
    union all 
    select child.* 
    from test child 
    join tree parent ON child.parentid = parent.childid and child.recordstatus = 1 --<< this is the CONNECT BY part 
) 
select * 
from tree 

Я не 100%, если вы хотите применить условие recordstatus = 1 к началу рекурсии.


Oracle не соответствует стандарту здесь, и вы не можете использовать recursive ключевое слово.

Так что вам нужно удалитьrecursive из запроса выше (то же верно и для SQL Server)

Более подробную информацию о рекурсивных общих табличных выражений (так называемые «подзапрос факторинга» в Oracle) можно найти в руководство:

https://docs.oracle.com/database/121/SQLRF/statements_10002.htm#SQLRF55268

+0

Примечание: если OP перемещается на SQL Server (возможно, он намечен параметрами '@' для параметров), то SQL Server не поддерживает этот синтаксис, но поддерживает эту идею, просто требует, чтобы ключевое слово 'recursive' было опущены. – hvd

+0

@hvd: Penguen специально запросил ANSI SQL, а ключевое слово «рекурсивное» требуется в соответствии со стандартом. –

+0

Мне это известно, и я не пытаюсь сказать, что ваш ответ неверен в вопросе, который фактически задал ОП. Однако я подозреваю, что ОП задал неправильный вопрос. – hvd