Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Странности в подзапросе  [new]
aspirant82
Member

Откуда:
Сообщений: 2
Вот такой пример (Oracle 12) - исходный был сложнее - я его упростил до минимума:

with table1 as (                 
          select 1 as field from DUAL 
             union
          select 2 as field from DUAL
             union
          select 5 as field from DUAL
) 
select field from table1 
where 2 = (select min(field) from dual) or
      1 = (select max(field) from dual)


Результат запроса - 2 строки
_
1
2


Не могу понять, почему это в принципе выполняется (по-моему мнению, подзапрос не должен видеть поле внешней таблицы) и как оно работает )
Плиз, хелп...
13 мар 19, 15:38    [21831451]     Ответить | Цитировать Сообщить модератору
 Re: Странности в подзапросе  [new]
Melkomyagkii_newbi
Member

Откуда: из прошлого
Сообщений: 1718
      
DECLARE

  l_clob CLOB;

BEGIN

  DBMS_UTILITY.expand_sql_text (

    input_sql_text  => 'with table1 as (                 
          select 1 as field from DUAL 
             union
          select 2 as field from DUAL
             union
          select 5 as field from DUAL
) 
select field from table1 
where 2 = (select min(field) from dual) or
      1 = (select max(field) from dual)',

    output_sql_text => l_clob

  );

  DBMS_OUTPUT.put_line(l_clob);

END;



SELECT
        "A1"."FIELD" "FIELD"
FROM
        (
                ( SELECT
                        1 "FIELD"
                FROM
                        "SYS"."DUAL" "A7"
                ) UNION ( SELECT
                        2 "FIELD"
                FROM
                        "SYS"."DUAL" "A6"
                ) UNION ( SELECT
                        5 "FIELD"
                FROM
                        "SYS"."DUAL" "A5"
                )
        ) "A1"
WHERE
                2 = (
                        SELECT
                                MIN("A1"."FIELD") "MIN(FIELD)"
                        FROM
                                "SYS"."DUAL" "A3"
                )
        OR
                1 = (
                        SELECT
                                MAX("A1"."FIELD") "MAX(FIELD)"
                        FROM
                                "SYS"."DUAL" "A2"
                )
13 мар 19, 15:46    [21831461]     Ответить | Цитировать Сообщить модератору
 Re: Странности в подзапросе  [new]
AmKad
Member

Откуда:
Сообщений: 4921
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/Using-Subqueries.html#GUID-53A705B6-0358-4E2B-92ED-A83DE83DFD20
Oracle performs a correlated subquery when a nested subquery references a column from a table referred to a parent statement one level above the subquery. The parent statement can be a SELECT, UPDATE, or DELETE statement in which the subquery is nested. A correlated subquery conceptually is evaluated once for each row processed by the parent statement.
13 мар 19, 15:47    [21831463]     Ответить | Цитировать Сообщить модератору
 Re: Странности в подзапросе  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28718
aspirant82
по-моему мнению, подзапрос не должен видеть поле внешней таблицы
RTFM correlated subquery (FAQ)
13 мар 19, 15:50    [21831467]     Ответить | Цитировать Сообщить модератору
 Re: Странности в подзапросе  [new]
merch
Member

Откуда:
Сообщений: 134
aspirant82,

where 2 = (select min(field) from dual) or
      1 = (select max(field) from dual)


а что желаете получить этими min/max?
13 мар 19, 16:19    [21831505]     Ответить | Цитировать Сообщить модератору
 Re: Странности в подзапросе  [new]
aspirant82
Member

Откуда:
Сообщений: 2
merch, да я чужой код разбирал, там был подзапрос, который (как я уже понял ничего не делал) .

Всем спасибо, хотя и стыдно немного за тупость свою )
13 мар 19, 16:34    [21831522]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить