Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Где лучше указывать условие, в join или where?  [new]
Alibek B.
Member

Откуда:
Сообщений: 3722
Сразу оговорюсь, что речь исключительно про inner join.
Нужно связать две таблицы по ключу (типу) и из полученного результата выбрать строки с определенным статусом.
Какой вариант лучше?
Этот:
select *
from t1
join t2 on (t2.type_id = t1.type_id)
where t2.status > 0

или этот:
select *
from t1
join t2 on (t2.type_id = t1.type_id and t2.status > 0)

?
На форумах встречал точку зрения, что нужно придерживаться семантики — в JOIN указывать условия для связывания и выбора данных, а в WHERE указывать условия для фильтрации данных, и с этой точки зрения первый вариант предпочтительнее и логичнее.
Но на тех же форумах встречал и другую точку зрения, что WHERE применяется уже после того, как соединения и строки были выбраны, поэтому лучше использовать второй вариант.


________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
30 сен 16, 20:36    [19730594]     Ответить | Цитировать Сообщить модератору
 Re: Где лучше указывать условие, в join или where?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51796

Alibek B.
Но на тех же форумах встречал и другую точку зрения, что WHERE применяется уже после того,
как соединения и строки были выбраны

Никогда больше не ходи на форумы, где ты увидел этот бред.

Posted via ActualForum NNTP Server 1.5

30 сен 16, 20:39    [19730608]     Ответить | Цитировать Сообщить модератору
 Re: Где лучше указывать условие, в join или where?  [new]
Alibek B.
Member

Откуда:
Сообщений: 3722
Я как бы не на одном форуме это увидел.
Я гуглил по запросу «oracle condition where vs join» и подобная точка зрения встречалась на разных ресурсах.
30 сен 16, 20:55    [19730651]     Ответить | Цитировать Сообщить модератору
 Re: Где лучше указывать условие, в join или where?  [new]
проходил мимо...
Member

Откуда: от верблюда
Сообщений: 1178
Alibek B.
Какой вариант лучше?

План смотрел? А чего тогда спрашиваешь?
30 сен 16, 21:19    [19730752]     Ответить | Цитировать Сообщить модератору
 Re: Где лучше указывать условие, в join или where?  [new]
не умею искать
Guest
Dimitry Sibiryakov
Никогда больше не ходи на форумы
достаточно, чтобы он не писал на этом.
30 сен 16, 22:40    [19731032]     Ответить | Цитировать Сообщить модератору
 Re: Где лучше указывать условие, в join или where?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51796

Alibek B.
Я как бы не на одном форуме это увидел.

Вот ни на один из них и не ходи.

Alibek B.
подобная точка зрения встречалась на разных ресурсах.

Теперь у тебя есть список ресурсов, написанное на которых не стоит гроша выеденного.

Posted via ActualForum NNTP Server 1.5

30 сен 16, 23:44    [19731262]     Ответить | Цитировать Сообщить модератору
 Re: Где лучше указывать условие, в join или where?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
Alibek B.
На форумах встречал точку зрения, что нужно придерживаться семантики — в JOIN указывать условия для связывания и выбора данных, а в WHERE указывать условия для фильтрации данных, и с этой точки зрения первый вариант предпочтительнее и логичнее.


Вот это правильно.

Alibek B.
Но на тех же форумах встречал и другую точку зрения, что WHERE применяется уже после того, как соединения и строки были выбраны, поэтому лучше использовать второй вариант.


А вот то или бред или ты чего-то недопонял. WHERE применяется "уже после того" при outer join а с inner join все в кучу а уж потом оптимайзер решит в каком порядке.

SY.
1 окт 16, 00:29    [19731367]     Ответить | Цитировать Сообщить модератору
 Re: Где лучше указывать условие, в join или where?  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2855
SY
А вот то или бред или ты чего-то недопонял. WHERE применяется "уже после того" при outer join...

Ну как только рука поднимается такое писать?
1 окт 16, 11:31    [19731934]     Ответить | Цитировать Сообщить модератору
 Re: Где лучше указывать условие, в join или where?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
AlexFF__|
SY
А вот то или бред или ты чего-то недопонял. WHERE применяется "уже после того" при outer join...

Ну как только рука поднимается такое писать?


Для особо продвинутых:

SQL> select  dname,
  2          ename,
  3          sal
  4    from      dept d
  5          left join
  6              emp e
  7            on    e.deptno = d.deptno
  8               and
  9                  sal > 4000
 10  /

DNAME          ENAME                                 SAL
-------------- ------------------------------ ----------
ACCOUNTING     KING                                 5000
RESEARCH
SALES
OPERATIONS

SQL> select  dname,
  2          ename,
  3          sal
  4    from      dept d
  5          left join
  6              emp e
  7            on    e.deptno = d.deptno
  8    where sal > 4000
  9  /

DNAME          ENAME                                 SAL
-------------- ------------------------------ ----------
ACCOUNTING     KING                                 5000

SQL> select  dname,
  2          ename,
  3          sal
  4    from      dept d
  5          left join
  6              emp e
  7            on    e.deptno = d.deptno
  8               and
  9                  sal > 10000
 10  /

DNAME          ENAME                                 SAL
-------------- ------------------------------ ----------
ACCOUNTING
RESEARCH
SALES
OPERATIONS

SQL> select  dname,
  2          ename,
  3          sal
  4    from      dept d
  5          left join
  6              emp e
  7            on    e.deptno = d.deptno
  8    where sal > 10000
  9  /

no rows selected

SQL>


SY.

Сообщение было отредактировано: 1 окт 16, 14:52
1 окт 16, 14:49    [19732284]     Ответить | Цитировать Сообщить модератору
 Re: Где лучше указывать условие, в join или where?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
И это не зависит от того ссылается ли WHERE на левую или на правую таблицу:

SQL> select  dname,
  2          ename,
  3          sal
  4    from      dept d
  5          left join
  6              emp e
  7            on     e.deptno = d.deptno
  8               and
  9                   d.deptno = 10
 10  /

DNAME          ENAME                                 SAL
-------------- ------------------------------ ----------
ACCOUNTING     CLARK                                2450
ACCOUNTING     KING                                 5000
ACCOUNTING     MILLER                               1300
OPERATIONS
SALES
RESEARCH

6 rows selected.

SQL> select  dname,
  2          ename,
  3          sal
  4    from      dept d
  5          left join
  6              emp e
  7            on    e.deptno = d.deptno
  8    where d.deptno = 10
  9  /

DNAME          ENAME                                 SAL
-------------- ------------------------------ ----------
ACCOUNTING     CLARK                                2450
ACCOUNTING     KING                                 5000
ACCOUNTING     MILLER                               1300

SQL>


А таперичи посмотрим как Oracle расширяет оба SQL:

SQL> set long 10000
SQL> variable c clob
SQL> begin
  2      dbms_utility.expand_sql_text('select  dname,
  3          ename,
  4          sal
  5    from      dept d
  6          left join
  7              emp e
  8            on     e.deptno = d.deptno
  9               and
 10                   d.deptno = 10',:c);
 11  end;
 12  /

PL/SQL procedure successfully completed.

SQL> print c

C
--------------------------------------------------------------------------------
SELECT  "A1"."DNAME_1" "DNAME",
        "A1"."ENAME_2" "ENAME",
        "A1"."SAL_3" "SAL"
  FROM  (
         SELECT  "A3"."DEPTNO" "QCSJ_C000000000300000",
                 "A3"."DNAME" "DNAME_1",
                 "A2"."ENAME""ENAME_2",
                 "A2"."SAL" "SAL_3",
                 "A2"."DEPTNO" "QCSJ_C000000000300001"
           FROM  "SCOTT"."DEPT" "A3",
                 "SCOTT"."EMP" "A2"
           WHERE "A2"."DEPTNO"(+) = "A3"."DEPTNO"
             AND "A3"."DEPTNO"= CASE
                                  WHEN ("A2"."DEPTNO"(+) IS NOT NULL) THEN 10
                                  ELSE 10
                                END
        ) "A1"


SQL> begin
  2      dbms_utility.expand_sql_text('select  dname,
  3          ename,
  4          sal
  5    from      dept d
  6          left join
  7              emp e
  8            on    e.deptno = d.deptno
  9    where d.deptno = 10',:c);
 10  end;
 11  /

PL/SQL procedure successfully completed.

SQL> print c

C
--------------------------------------------------------------------------------
SELECT  "A1"."DNAME_1" "DNAME",
        "A1"."ENAME_2" "ENAME",
        "A1"."SAL_3" "SAL"
  FROM  (
         SELECT  "A3"."DEPTNO" "QCSJ_C000000000300000_0",
                 "A3"."DNAME" "DNAME_1",
                 "A2"."ENAME" "ENAME_2",
                 "A2"."SAL" "SAL_3",
                 "A2"."DEPTNO" "QCSJ_C000000000300001"
           FROM  "SCOTT"."DEPT" "A3",
                 "SCOTT"."EMP" "A2"
           WHERE "A2"."DEPTNO"(+) = "A3"."DEPTNO"
        ) "A1"
  WHERE "A1"."QCSJ_C000000000300000_0" = 10

SQL>


SY.
1 окт 16, 15:09    [19732327]     Ответить | Цитировать Сообщить модератору
 Re: Где лучше указывать условие, в join или where?  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2855
SY,
Сколько всего ненужного ты понаписал :)

Достаточно только одного примера:
select  *
     from dept d
     left join emp e on e.deptno = d.deptno
       where d.любое_поле = :1

Потом смотрим:
SY
WHERE применяется "уже после того" при outer join...

Ты также продолжишь утверждать, что сначала join потом where?
1 окт 16, 16:02    [19732439]     Ответить | Цитировать Сообщить модератору
 Re: Где лучше указывать условие, в join или where?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
AlexFF__|
Ты также продолжишь утверждать, что сначала join потом where?


Да. Это ANSI правило. И оптимайзер руководствуясь этим решаем можно ли все до кучи или нет. Например:

select  dname,ename
     from dept d
     left join emp e on e.deptno = d.deptno
       where e.ename = 'AlexFF__|'
/


Тут можно все до кучи и это видно по:

begin
    dbms_utility.expand_sql_text('select  dname,ename
     from dept d
     left join emp e on e.deptno = d.deptno
       where e.ename = ''AlexFF__|''',:c);
end;
/
print c
SELECT  "A1"."DNAME_1" "DNAME",
        "A1"."ENAME_2" "ENAME"
  FROM  (
         SELECT  "A3"."DEPTNO" "QCSJ_C000000000300000",
                 "A3"."DNAME" "DNAME_1",
                 "A2"."ENAME" "ENAME_2",
                 "A2"."DEPTNO" "QCSJ_C000000000300001"
           FROM  "SCOTT"."DEPT" "A3",
                 "SCOTT"."EMP" "A2"
           WHERE "A2"."DEPTNO"="A3"."DEPTNO"
        ) "A1"
  WHERE "A1"."ENAME_2"='AlexFF__|'


Оптимайзер даже поменял outer на inner join. А вот тут нельзя до кучи:

select  dname,ename
     from dept d
     left join emp e on e.deptno = d.deptno
       where d.loc = 'AlexFF__|'
/


begin
    dbms_utility.expand_sql_text('select  dname,ename
     from dept d
     left join emp e on e.deptno = d.deptno
       where d.loc = ''AlexFF__|''',:c);
end;
/
print c
SELECT  "A1"."DNAME_1" "DNAME",
        "A1"."ENAME_3" "ENAME"
  FROM  (
         SELECT  "A3"."DEPTNO" "QCSJ_C000000000300000",
                 "A3"."DNAME" "DNAME_1",
                 "A3"."LOC" "LOC_2",
                 "A2"."ENAME" "ENAME_3",
                 "A2"."DEPTNO" "QCSJ_C000000000300001"
           FROM  "SCOTT"."DEPT" "A3",
                 "SCOTT"."EMP" "A2"
           WHERE "A2"."DEPTNO"(+)="A3"."DEPTNO"
        ) "A1"
  WHERE "A1"."LOC_2"='AlexFF__|'


Но это все об оптимайзере. А я о прогрaммисте который должен понимать что логически сначала join а уж потом filter (ибо фильтруем результат) и при outer join прописка условия в ON или в WHERE может кардинально повлиять на результат.

SY.

Сообщение было отредактировано: 1 окт 16, 18:05
1 окт 16, 17:58    [19732686]     Ответить | Цитировать Сообщить модератору
 Re: Где лучше указывать условие, в join или where?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
AlexFF__|
Ты также продолжишь утверждать, что сначала join потом where?


Кстати, даже при native outer join Oracle делит предикаты WHERE на join conditions и filter conditions. Почитай Guidelines for Using Outer Join Syntax (Doc ID 14736.1) где четко расписан порядок действий (логический) и последним шагом является "Rows that do not pass the non-outer join predicates are removed". А non-outer join predicates и есть по сути ANSIшный WHERE ну и outer join predicates есть ANSIшный ON.

SY.
1 окт 16, 18:52    [19732840]     Ответить | Цитировать Сообщить модератору
 Re: Где лучше указывать условие, в join или where?  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
SY,

Если б where с предикатом по внутренней таблице применялось после, то следующий запрос валился бы с ошибкой.
select *
from (select rownum id from dual connect by rownum <= 3) t1
left join (select rownum id from dual connect by rownum <= 3) t2 on t1.id = t2.id and 1/(t1.id-2) > 0
where t1.id <> 2;
На металинке неплохое объяснение про pre/post предикаты, но там во всех предикатах фигурирует внешняя таблица.
1 окт 16, 19:06    [19732881]     Ответить | Цитировать Сообщить модератору
 Re: Где лучше указывать условие, в join или where?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
dbms_photoshop
SY,

Если б where с предикатом по внутренней таблице применялось после, то следующий запрос валился бы с ошибкой.


Опять 25. Я говoрю про правила а ты про имплементацию. Посмотри на:

SQL> begin
  2      dbms_utility.expand_sql_text('select *
  3  from (select rownum id from dual connect by rownum <= 3) t1
  4  left join (select rownum id from dual connect by rownum <= 3) t2 on t1.id = t2.id and 1/(t1.id-2) > 0
  5  where t1.id <> 2',:c);
  6  end;
  7  /

PL/SQL procedure successfully completed.

SQL> print c

C
--------------------------------------------------------------------------------
SELECT  "A1"."ID_0" "ID",
        "A1"."ID_1" "ID"
  FROM  (
         SELECT  "A3"."ID" "ID_0",
                 "A2"."ID" "ID_1"
           FROM  (
                  SELECT  ROWNUM "ID"
                    FROM  "SYS"."DUAL" "A4"
                    CONNECT BY ROWNUM<=3
                 ) "A3",
                 (
                  SELECT  ROWNUM "ID"
                    FROM  "SYS"."DUAL" "A5"
                    CONNECT BY ROWNUM<=3
                 ) "A2"
           WHERE "A3"."ID" = "A2"."ID"(+)
             AND 1/("A3"."ID"-2) > CASE
                                     WHEN ("A2"."ID"(+) IS NOT NULL) THEN 0
                                     ELSE 0
                                   END
        ) "A1"
  WHERE "A1"."ID_0"<>2


Ведь все расписaно - inline view делает left join a main select фильтрует результат left join'a. Ну а дальше оптимизатор колдует как эту логику оптимальней выполнить и понимает что оптимальней сначала отфильтровать левую тaблицу. Как результат, ZERODIVIDE не выскакивает. Тот-же результaт мы имеем при WHERE условие1 AND условие2 когда, например одно из них FALSE а другое вызывает ZERODIVIDE. Вот в каком порядке оптимайзер решит их выполнить зависит получим ли мы ZERODIVIDE или нет.

Еще рaз, SQL стандарт четко разгранивает условия соединения и условия фильтрации и прямо говорит - сначала соединяем а потом фильтруем. A оптимизатор эти все условия рассмотрит и решит как и в каком порядке но в любом случае исходя из того что результaт должен быть такoй-же как и при сначала соединяем а потом фильтруем.

SY.

Сообщение было отредактировано: 1 окт 16, 21:59
1 окт 16, 21:56    [19733482]     Ответить | Цитировать Сообщить модератору
 Re: Где лучше указывать условие, в join или where?  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
SY
Опять 25. Я говoрю про правила а ты про имплементацию.
Когда я пытался говорить про логический порядок (правила) - набежало экспертов по имплементации. :) 16016806
SY
SQL стандарт четко разгранивает условия соединения и условия фильтрации и прямо говорит - сначала соединяем а потом фильтруем
Был бы благодарен за указание где об этом сказано в стандарте SQL:2003.

Я с логической точки зрения с вами согласен, но за 20 минут найти в стандарте про порядок выполнения не удалось.
1 окт 16, 22:52    [19733677]     Ответить | Цитировать Сообщить модератору
 Re: Где лучше указывать условие, в join или where?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
dbms_photoshop
Был бы благодарен за указание где об этом сказано в стандарте


Если ты ищешь что-то типа фразы "сначала join а потом where", то ничего не найдешь. Стандарт это язык определений и связей между ними. Открываем например ANSI/ISO/IEC International Standard (IS) Database Language SQL — Part 2: Foundation (SQL/Foundation) «Part 2». Смотрим определение where clause:


7.8 <where clause>

Format
<where clause> ::= WHERE <search condition>

Syntax Rules
1) Let T be the result of the preceding <from clause>. Each column reference directly contained in
the <search condition> shall unambiguously reference a column of T or be an outer reference.


Смотрим определение <from clause>:


7.5 <from clause>

Format
<from clause> ::=
FROM <table reference list>
<table reference list> ::=
<table reference> [ { <comma> <table reference> }... ]


Смотрим определение <table reference>:

7.6 <table reference>

Function
Reference a table.
Format
<table reference> ::=
<table primary>
| <joined table>


Смотрим определение <joined table>:

7.7 <joined table>

Function
Specify a table derived from a Cartesian product, inner or outer join, or union join.
Format
<joined table> ::=
<cross join>
| <qualified join>
| <natural join>
| <union join>
<cross join> ::=
<table reference> CROSS JOIN <table primary>
<qualified join> ::=
<table reference> [ <join type> ] JOIN <table reference>
<join specification>
<natural join> ::=
<table reference> NATURAL [ <join type> ] JOIN <table primary>
<union join> ::=
<table reference> UNION JOIN <table primary>
<join specification> ::=
<join condition>
| <named columns join>
<join condition> ::= ON <search condition>
<named columns join> ::=
USING <left paren> <join column list> <right paren>
<join type> ::=
INNER
| <outer join type> [ OUTER ]
<outer join type> ::=
LEFT
| RIGHT
| FULL
<join column list> ::= <column name list>


То есть WHERE clause применяется к результату предшествующей FROM clause котoрая в свою очередь есть либо физическая таблица либо таблица полученная (derived) путем соединения (join) таблиц. То есть сначала join а потом WHERE.

SY.
2 окт 16, 05:47    [19734321]     Ответить | Цитировать Сообщить модератору
 Re: Где лучше указывать условие, в join или where?  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2855
SY
Да. Это ANSI правило. И оптимайзер руководствуясь этим решаем можно ли все до кучи или нет. Например:
............................................................
Но это все об оптимайзере. А я о прогрaммисте который должен понимать что логически сначала join а уж потом filter (ибо фильтруем результат) и при outer join прописка условия в ON или в WHERE может кардинально повлиять на результат.
SY.

Причем тут правила и примеры с expand_sql_text, показывающие запрос на входе построителя планов?
Ты рассказываешь топикстартеру по сферического коня в вакууме, который будет только полезен при писании рефератов студентам.
Что толку от теории логического порядка, если у ТС сейчас создается впечатление, что его предположение правильно?
Alibek B.
Но на тех же форумах встречал и другую точку зрения, что WHERE применяется уже после того, как соединения и строки были выбраны, поэтому лучше использовать второй вариант.

Это форум oracle, тут людей интересует, как ты писал, имплементация.
Так что извини, но мне кажется, что ты путаешь не только ТС, но и, учитывая твой статус, многих других интересующих.
2 окт 16, 10:10    [19734475]     Ответить | Цитировать Сообщить модератору
 Re: Где лучше указывать условие, в join или where?  [new]
в кучу кони, люди
Guest
Высокие материи. Влияние логического порядка на производительность, подкрепленные частными вариантами планов.
2 окт 16, 10:14    [19734487]     Ответить | Цитировать Сообщить модератору
 Re: Где лучше указывать условие, в join или where?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51796

SY
То есть WHERE clause применяется к результату предшествующей FROM clause

В данном случае она "предшествует" чисто синтаксически. То есть выделенное предложение
говорит, что WHERE в тексте запроса стоит после FROM и ничего больше.

Posted via ActualForum NNTP Server 1.5

2 окт 16, 11:17    [19734549]     Ответить | Цитировать Сообщить модератору
 Re: Где лучше указывать условие, в join или where?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18373
Dimitry Sibiryakov
SY
То есть WHERE clause применяется к результату предшествующей FROM clause

В данном случае она "предшествует" чисто синтаксически. То есть выделенное предложение
говорит, что WHERE в тексте запроса стоит после FROM и ничего больше.

Коллеги, это уже детский сад.
Соломон показал, что оно:
- так работает
- так реализовано
- так описано в стандарте

То, что в частных конкретных случаях (включая innser join) фильтры могут без нарушения логики быть протолкнуты непосредственно к rowsource - не меняет принципа.
Логически предикаты where применяются к множеству, определенному from.
Точка.
Если начинающий программист будет воспринимать это именно так - не допустит дурацких ошибок, которыми бывает пересыпан код начинающих, не осознающих разницы.
2 окт 16, 14:19    [19734754]     Ответить | Цитировать Сообщить модератору
 Re: Где лучше указывать условие, в join или where?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
Dimitry Sibiryakov
SY
То есть WHERE clause применяется к результату предшествующей FROM clause

В данном случае она "предшествует" чисто синтаксически. То есть выделенное предложение
говорит, что WHERE в тексте запроса стоит после FROM и ничего больше.


Смотрим определение where clause:


7.8 <where clause>

Syntax Rules
1) Let T be the result of the preceding <from clause>. Each column reference directly contained in
the <search condition> shall unambiguously reference a column of T or be an outer reference.

General Rules
1) The <search condition> is applied to each row of T. The result of the <where clause> is a table
of those rows of T for which the result of the <search condition> is true.


То есть General Rules прямо говорит что WHERE применяется к T а T есть результат FROM а FROM есть либо таблица либо их соединение (joned table) а их соединение имеет только ON clause и никаких WHERE.

SY.

Сообщение было отредактировано: 2 окт 16, 14:21
2 окт 16, 14:20    [19734755]     Ответить | Цитировать Сообщить модератору
 Re: Где лучше указывать условие, в join или where?  [new]
booby
Member

Откуда:
Сообщений: 2257
andrey_anonymous
...
То, что в частных конкретных случаях (включая innser join) фильтры могут без нарушения логики быть протолкнуты ...
не меняет принципа.
...

вот это и есть главный вопрос трансформации - допустимо ли "проталкивать" t1.id <> 2, в условиях, когда внешнее соединение соединение ожидается по условию 1/(t1.id-2) > 0
Эквивалентен ли результат запроса, который должен давать ошибку на этапе построения соединения, запросу, возвращающему набор данных без ошибок.
Даваемый конкретной реализацией ответ - эквивалентен, так как "проталкивание" произошло.
Требуется объяснить эквивалентность без нарушения логики.
3 окт 16, 02:47    [19735796]     Ответить | Цитировать Сообщить модератору
 Re: Где лучше указывать условие, в join или where?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
AlexFF__|
Это форум oracle, тут людей интересует, как ты писал, имплементация.
Так что извини, но мне кажется, что ты путаешь не только ТС, но и, учитывая твой статус, многих других интересующих.


Боюсь что путаешь ты сам себя. Открою тебе страшный секрет - имплементации, как таковой, нет. Есть имплементация каждой отдельно взятой версии. Сегодня так а завтра уже чуть-чуть не так. И имплементация эта нигде не документировaна и "изучаема" она чисто эмпирически. Изучать имплементацию нужно с точки зрения тюнинга но, IMHO, не более и пoсле того как четко изучил стандарт ибо не зная что должно быть на выходе невозможно оценить имплементацию. И повторюсь eсть имплементация каждой отдельно взятой версии. Поэтому перезд на новую версию всегда более или менее pain in the but.

SY.

Сообщение было отредактировано: 3 окт 16, 03:44
3 окт 16, 03:42    [19735800]     Ответить | Цитировать Сообщить модератору
 Re: Где лучше указывать условие, в join или where?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18373
booby
вот это и есть главный вопрос трансформации - допустимо ли "проталкивать" t1.id <> 2, в условиях, когда внешнее соединение соединение ожидается по условию 1/(t1.id-2) > 0
Эквивалентен ли результат запроса, который должен давать ошибку на этапе построения соединения, запросу, возвращающему набор данных без ошибок.

То есть по основному вопросу - о том, что предикаты where относятся к множеству, определенному from, возражений нет.
Ок, давайте теперь рассмотрим вопрос о предикате 1/(t1.id-2) > 0.
Теоретически:
Предикат описывает множество, для которого указанное выражение истинно.
Ничего другого он не описывает.
Вопрос "истинно ли выражение 1/(t1.id-2) > 0 для t1.id = 2" определяет, входит указанная строка в множество или нет.
То, что значение выражения не определено для t1.id = 2 в рамках трехзначной логики означает, что выражение не истинно и строка во множество, определенное предикатом, не входит.
Таким образом, тезис, о том, что SQL-запрос "ДОЛЖЕН давать ошибку" в указанной ситуации - на самом деле ложен, выбрасывание исключения "деление на 0" следует отнести скорее к особенностям реализации, а фильтр "t1.id <> 2" можно считать (теоретически) не влияющим на результат, поскольку записи с t1.id = 2 не является элементом множества, отвечающего предикату "1/(t1.id-2) > 0".

Практически:
Все мы знаем, что вычисление значения выражения по сокращенному пути (short circuit evaluation) может давать тот же эффект в отношении исключительных ситуаций в императивных языках, в т.ч. в PL/SQL. И, будучи должным образом документировано, такое поведение никого это не парит.
Почему подобное поведение должно беспокоить в декларативном SQL, для которого вообще не имеет смысла само понятие exception (ну нет в ЯЗЫКЕ SQL средств для работы с исключительными ситуациями)?
Беспокоить может лишь нестабильность результата (то набор данных, то аварийное завершение в зависимости от положения звезд на небе) - и подобное поведение (if any) мы смело запишем в недостатки конкретной реализации.

Вот как-то так.
3 окт 16, 04:43    [19735802]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить