powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Разница между запятой и JOIN
88 сообщений из 88, показаны все 4 страниц
Разница между запятой и JOIN
    #33547238
Арбайтер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объясните мне, в чем разница между запросами:

SELECT table2.name FROM table1, table2
WHERE table1.id=table2.id

и

SELECT table2.name FROM table1
INNER JOIN table2 ON table1.id=table2.id

Результат вернется один и тот же обоими запросами. У обоих, по сути, одно и то же условие.
Зачем нужны JOIN-ы, если можно перечислить таблицы, из которых хочешь сделать выборку и описать условия, по которым сопоставить строки?
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33547419
Фотография adv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1
2
3 и дальше сам.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33547554
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АрбайтерЗачем нужны JOIN-ы
Низачем.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33547835
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Арбайтер
Зачем нужны JOIN-ы,

Чтобы
1 отделить условие на соединение от условий на выборку.
2 повысить семантичность
3 более строго управлять порядком соединениями.

4 вообще строгость. Если чел написал CROSS JOIN, то он явно прописал свое намерение. А без этого поди догадайся - мож он ошибся.
У Оракла, например, полно ограничений на внешние соединения. И он рекомендует outer join вмсето (+). Кроме того, есть естественные соединения - вообще без условий.
А раз для этих соединений, то для единого стиля и для всех прочих нужен единообразный синтаксис.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33554049
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну давайте начнем очередной виток.

vadiminfo1 отделить условие на соединение от условий на выборку.
Хм. А можете ли Вы рассказать, для запроса с более чем одной таблицей, чем одно концептуально отличается от другого? Дать достаточно формальный алгоритм "логичного" выбора между вариантами

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
select *
from a join b on a.id = b.id
where b.value =  3 

select *
from a join b on (a.id = b.id and b.value =  3 )

with c as (select * from b where value =  3 )
select *
from a join c on a.id = b.id

повысить семантичность
Не понимаю, что имеется в виду, но видимо как-то связано с предыдущим пунктом.

более строго управлять порядком соединениями.
И зачем? Если учесть, что SQL как раз декларативен, и предписывает не алгоритм (в том числе порядок соединений), но описывает результат, который должен получиться.

4 вообще строгость. Если чел написал CROSS JOIN, то он явно прописал свое намерение. А без этого поди догадайся - мож он ошибся.
В чем-то согласен. С другой стороны, CROSS JOIN - вещь весьма и весьма редкая, и только такой плюс никак не искупит все минусы подхода, например двойственный синтаксис.

У Оракла, например, полно ограничений на внешние соединения. И он рекомендует outer join вмсето (+).
Ну, надо смотреть, что лежит под этими рекомендациями, какое основание. Если основание - "подмазать комитет ANSI и за счет этого выторговать что-то другое", то это не то чтобы полноценный аргумент.

Кроме того, есть естественные соединения - вообще без условий.
И? Получается простой и понятный запрос, куда удачнее, нежели с дополнительным уродливым join-ом.

Заодно - мне всегда очень прикольно видеть, как в синтаксис join-ов пытаются впихнуть такую вещь, как условия соединения, затрагивающие несколько таблиц разом. Скажем,

Код: plaintext
1.
select ...
from a join b on (a.id = b.id and a.id2 = b.id2) join c on (c.id = b.id and c.id3 = a.id3)

vadiminfoА раз для этих соединений, то для единого стиля и для всех прочих нужен единообразный синтаксис.
Хм. Лучшее, что можно сделать для единообразного стиля - это придумать второй стиль, причем не способный адекватно заменить первый. Интересная мысль :)
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33554129
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 softwarer
На внутреннем соединения отличия не так ощутимы. Однако, даже здесь есть все-таки разница. Операция соединения и выборки все же разные в рел алгебре. А WHERE - больше выборка, и при "больших" условиях отличить там условия на соединения от прочих сложнее. Кроме того, кроме условия ON, может быть USING. В некоторых случаях это семантичнее.

softwarer
И зачем? Если учесть, что SQL как раз декларативен, и предписывает не алгоритм (в том числе порядок соединений), но описывает результат, который должен получиться.

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

softwarer
Ну, надо смотреть, что лежит под этими рекомендациями, какое основание. Если основание - "подмазать комитет ANSI и за счет этого выторговать что-то другое", то это не то чтобы полноценный аргумент.

Возможно. не полноценный. Но какой ни на есть, а тоже говорит о том, что слишком много разного в WHERE не просто примирить.

softwarer
Заодно - мне всегда очень прикольно видеть, как в синтаксис join-ов пытаются впихнуть такую вещь, как условия соединения, затрагивающие несколько таблиц разом. Скажем,

Но с другой стороны - мысль автора запроса выражена явно. Все-таки более строгая спецификация. Разве нет?

softwarer
Хм. Лучшее, что можно сделать для единообразного стиля - это придумать второй стиль, причем не способный адекватно заменить первый. Интересная мысль :)

Я имел в виду, что польза для внешних соединений или от естественных соединений есть. Ну тада и для внутреннего из двух таблиц тоже лучше JOIN, чтобы не было тут запятые, тут JOIN.
Чтобы тада уже во всех соединениях был JOIN. Так как автор спрашивал на примере внутреннего соединения из двух табл без сложных WHERE, где разница не ощутима.
Конечно, это больше про приложения или там множество отчетов. А итерактивно один маленький запрос - конечно роли не играет.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33555255
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoОперация соединения и выборки все же разные в рел алгебре.
А стоит ли "пользователю SQL" об этом думать? Они связаны достаточно тесно, так, что формальный критерий разделения сформулировать непросто (во всяком случае, я его просил...)

vadiminfoА WHERE - больше выборка, и при "больших" условиях отличить там условия на соединения от прочих сложнее.
Придерживаюсь строго противоположного мнения. В сложных запросах становится важным то, что WHERE дает свободу записи, в то время как JOIN диктует порядок условий, и как следствие FROM становится очень трудночитаемым. Собственно, в одной из предыдущих дискуссий я просил оппонентов подсказать удачное форматирование JOIN, и так и не увидел хорошего варианта.

Давайте посмотрим на пример: несколько таблиц с историей изменения записей. При использовании WHERE-соединений запрос можно записать примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select 
  ...
from 
  a, b, c, d
where
  -- основные соединения
  a.a_id = b.a_id and
  b.b_id = c.b_id and
  b.b_id = d.b_id and
  -- выбор нужных версий
  a.date_apply between b.date_from and b.date_to and
  .... еще куча сложных условий, которые как правило
  .... вовсе не нужно читать, чтобы понять запрос

Обратите внимание, здесь нет ни одного фильтра, в чистом виде соединение таблиц. С использованием JOIN это придется писать либо так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select  
  ...
from
  a join b on 
      (a.a_id = b.a_id and a.date_apply between b.date_from and b.date_to) 
   join c on
      (b.b_id = c.b_id and ...........) and
  .....

- то есть условия смешены в кучу и плохо воспринимаются, либо использовать "частичный where-синтаксис", то есть половину условий соединения написать в join, а половину - в where.

vadiminfoНу как же? Операции в алгебре, к сожалению, не всегда ассоциативны
Это редко существенно, и в этих редких случаях никто не мешает использовать скобки.

vadiminfoНо синтаксис с JOIN позволяет точно и однозначно определить порядок соединений. Например, неясности какие объединения внешние какие внутренние можно легче избежать.
Безусловно. Аналогичный аргумент называется среди преимуществ польской записи - также однозначное определение порядка операций без скобок. Но почему-то она не стала общепринятым методом выражения мыслей :) Этого недостаточно.

vadiminfoВозможно. не полноценный. Но какой ни на есть, а тоже говорит о том, что слишком много разного в WHERE не просто примирить.
Хм. Уже затронул выше - при свободе выражения мысли в WHERE примирить можно; в прокрустовом синтаксисе JOIN сманеврировать просто нечем.

vadiminfoНо с другой стороны - мысль автора запроса выражена явно.
Мысль выражена явно, но сама мысль получается кривовата. Не думаю что можно назвать хорошим синтаксис, заставляющий думать кривые мысли.

vadiminfoЯ имел в виду, что польза для внешних соединений или от естественных соединений есть. Ну тада и для внутреннего из двух таблиц тоже лучше JOIN, чтобы не было тут запятые, тут JOIN.
Так чем же он лучше, если он не способен адекватно заменить существующий? Это уже получается логика - "главное, использовать join, а аргументы подбираются на ходу".

Давайте предположим, что (как доказываете Вы), join-стиль лучше для сложных не-inner соединений. Давайте предположим, что он (как среди прочего доказываю я) хуже для inner-соединений. В этом случае Ваше "тогда" выглядит так: давайте испортим себе жизнь в 80% случаев ради облегчения ее же в 20% случаев. Выглядит небесспорно :)

vadiminfoКонечно, это больше про приложения или там множество отчетов. А итерактивно один маленький запрос - конечно роли не играет.
Могу сказать так. Не так давно мне потребовалось писать код генерации SQL по метаинформации, примерно как в Discoverer-е. Сначала я предположил, что join-синтаксис окажется в этом случае удобнее, именно из-за более четкого разделения "что с кем и как вяжется". А в итоге - перешел на where-синтаксис , сократив программный код примерно на треть.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33555666
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerС использованием JOIN это придется писать либо так:

...

- то есть условия смешены в кучу и плохо воспринимаются, либо использовать "частичный where-синтаксис", то есть половину условий соединения написать в join, а половину - в where.
При внешних соединениях может возникнуть разница, где какое условие указывать.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
SQL> create table a (a_id int);

Table created.

SQL> insert into a (a_id) values ( 1 );

 1  row created.

SQL> insert into a (a_id) values ( 2 );

 1  row created.

SQL> create table b (a_id int, b_id int);

Table created.

SQL> insert into b (a_id, b_id) values ( 10 ,  1 );

 1  row created.

SQL> select *
   2   from a
   3        left outer join b on a.a_id = b.a_id
   4   where b.b_id =  2 ;

no rows selected

SQL> select *
   2   from a
   3        left outer join b
   4          on  a.a_id = b.a_id
   5          and b.b_id =  2 ;

      A_ID       A_ID       B_ID
---------- ---------- ----------
          1 
          2 

SQL> with b2 as (select a_id, b_id from b where b_id =  2 )
   2   select *
   3   from a
   4        left outer join b2 on a.a_id = b2.a_id;

      A_ID       A_ID       B_ID
---------- ---------- ----------
          1 
          2 
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33556164
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
А стоит ли "пользователю SQL" об этом думать? Они связаны достаточно тесно, так, что формальный критерий разделения сформулировать непросто (во всяком случае, я его просил...)

Пользователю SQL лучше об этом думать - он же работает с реляционной БД. И если не будет об этом думать, то может не увидеть из-за деревьев леса. Это формально разные операции и пока не понимаю почему критерий разделения сформулировать не просто. Он приводится в литературе.

softwarer
Давайте посмотрим на пример: ...

- то есть условия смешены в кучу и плохо воспринимаются, либо использовать "частичный where-синтаксис", то есть половину условий соединения написать в join, а половину - в where.


Т.е. вы говорите, что они смешаны, а потом что полнвина в join половина в where. Т.е. все-тка разделены? А там где все в where получается большая куча.

softwarer
Это редко существенно, и в этих редких случаях никто не мешает использовать скобки.

Но эти редкие случаи могут приводить к ошибкам и большей возне при выяснении почему не правильно работает запрос? И еще более позднему выявлению, что он не правильно работает - при тестировании того плохого случая не нашли.

softwarer
Безусловно. Аналогичный аргумент называется среди преимуществ польской записи - также однозначное определение порядка операций без скобок. Но почему-то она не стала общепринятым методом выражения мыслей :) Этого недостаточно.


Так зато JOIN принят в SQL стандарты жестко, т.е. решили, что наработанный синтаксис не удачен и производители с этим согласились. Так что достаточно или нет - не такой простой вопрос.


softwarer
Хм. Уже затронул выше - при свободе выражения мысли в WHERE примирить можно; в прокрустовом синтаксисе JOIN сманеврировать просто нечем

Вот именно что не с чем - не возникает этих проблем смешения всего подряд.


softwarer
Мысль выражена явно, но сама мысль получается кривовата. Не думаю что можно назвать хорошим синтаксис, заставляющий думать кривые мысли.


Так что же Вы предпочтете, читая чужей код - кривоватую мысль явно выраженную, или кривоавтую, но не явно выраженную?

softwarer
Так чем же он лучше, если он не способен адекватно заменить существующий? Это уже получается логика - "главное, использовать join, а аргументы подбираются на ходу".

Насчет того, что не адеватно, особенно внешние соединения, пока не замечал. И в литературе тоже, вроде, нет таких утверждений.
Аргументы не походу - я есче литру читаю, когда пишу. По крайней мере в прошлый раз смротрел.


softwarer

Давайте предположим, что (как доказываете Вы), join-стиль лучше для сложных не-inner соединений. Давайте предположим, что он (как среди прочего доказываю я) хуже для inner-соединений. В этом случае Ваше "тогда" выглядит так: давайте испортим себе жизнь в 80% случаев ради облегчения ее же в 20% случаев. Выглядит небесспорно :)

Я не думаю что в 80% испортим себе жизнь, а вот в 20% улучшим - тут и Вы согласны? Я пользуюсь тока JOIN на 9-ке во всех случаях и мне не кажется ухудшением по сравненю с 8-кой, гда приходилось с запятыми.
Наоборот все строже и потому меньше времени потом на понимание что хотел автор.

softwarer

Могу сказать так. Не так давно мне потребовалось писать код генерации SQL по метаинформации, примерно как в Discoverer-е. Сначала я предположил, что join-синтаксис окажется в этом случае удобнее, именно из-за более четкого разделения "что с кем и как вяжется". А в итоге - перешел на where-синтаксис , сократив программный код примерно на треть.

У меня прямопротивоположный опыт. Я даже иду на то, что расписываю вместо таблов подзпросы ради NATURAL JOIN. Плюс подзапросы для тежелых запросов выношу в WITH. И пока очень рад тому что появились JOIN - ны в 9.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33557247
Выскажусь как DBA. У нас в компании принято разрабатывать отчеты непосредственно на боевом сервере (насчет консерватории - не ко мне вопрос). Не используя JOIN и пропустив условие во WHERE любой программист может лугко поставить раком всю систему. Так частенько и случалось, пока не приказали использовать только JOIN.
Конечно осталось немало других способов, но эта была достаточно большая проблема.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33557839
Slider_spb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласен с последним автором. И еще добавлю, что синтаксис с Join более строгий и как раз более легок для визуального восприятия, зато для динамического SQL синтаксис без них действительно более удобен. Так что нечего разводить тут "священные" войны, я использую тот, который удобней мне в конкретной задаче и ситуации.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33558633
mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Давайте посмотрим на пример: несколько таблиц с историей изменения записей. При использовании WHERE-соединений запрос можно записать примерно так:
...
Обратите внимание, здесь нет ни одного фильтра, в чистом виде соединение таблиц. С использованием JOIN это придется писать либо так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select  
  ...
from
  a join b on 
      (a.a_id = b.a_id and a.date_apply between b.date_from and b.date_to) 
   join c on
      (b.b_id = c.b_id and ...........) and
  .....

- то есть условия смешены в кучу и плохо воспринимаются, либо использовать "частичный where-синтаксис", то есть половину условий соединения написать в join, а половину - в where.Что-то непонятно про "частичный where-синтаксис". По ходу, это вы сами такое понятие сочинили, нет? По определению, в предложении JOIN записываются только условия собственно соединения, то есть равенство или другая тета-операция (<, >, <=, >=, <>) на столбцах двух таблиц. Никакие другие условия вроде "a.date_apply between b.date_from and b.date_to" никак к операции соединения не относятся . По определению. Поэтому они должны быть записаны в предложении where. Все очень четко по теории, никаких неоднозначностей. Фильтру -- фильтрово, джойну -- джойново.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33558978
problemsolver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mirПо определению, в предложении JOIN записываются только условия собственно соединения, то есть равенство или другая тета-операция (<, >, <=, >=, <>) на столбцах двух таблиц. Никакие другие условия вроде "a.date_apply between b.date_from and b.date_to" никак к операции соединения не относятся . По определению. Поэтому они должны быть записаны в предложении where. Все очень четко по теории, никаких неоднозначностей. Фильтру -- фильтрово, джойну -- джойново.

Блин, вот теоретики :-)
Чем тебе between не то же самое, что пара неравенств с AND
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33559003
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mirНикакие другие условия вроде "a.date_apply between b.date_from and b.date_to" никак к операции соединения не относятся .IMHO, несколько погорячимшись, это условие соединения, а не фильтра. Не обращаясь к источникам, опираясь только на IMHO, полагаю, что к условиям соединения относятся все условия, в которых происходит сравнение данных из одной таблицы с данными из другой таблицы. Хуже того, в случае внешних слияний даже сравнение поля с константой, обычно трактуемое как фильтр, вполне легально может перекочевать в условие соединения.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33560238
mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 problemsolver & ChA

Надеюсь, это не покажется грубым, но пора, пора, ребята, перечитать определение операции тета-соединения.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33562088
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mirпора, ребята, перечитать определение операции тета-соединения.Хотелось бы узнать, что во фразе ChAк условиям соединения относятся все условия, в которых происходит сравнение данных из одной таблицы с данными из другой таблицыпротиворечит определению тета-соединения ? Следует ли считать, что пример от softwarer
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select  
  ...
from
  a join b on 
      (a.a_id = b.a_id and a.date_apply between b.date_from and b.date_to) 
   join c on
      (b.b_id = c.b_id and ...........) and
  .....
правильно писать так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
select  
  ...
from
  a join b on 
      (a.a_id = b.a_id) 
   join c on
      (b.b_id = c.b_id and ...........) and
  .....
WHERE a.date_apply between b.date_from and b.date_to
.....
?
Возможно, не прав, так как не могу считать себя теоретиком, но ни одно из доступных мне определений тета-соединения не противоречит написанию условия a.date_apply between b.date_from and b.date_to в условиях слияния ON пункта FROM. Допускаю, что Вы сделали такое заключение на основании того, что в определении тета-соединения не упоминается оператор сравнения between ? IMHO, по этому поводу было сделано абсолютно справедливое, хотя и несколько грубоватое по форме, замечание problemsolverЧем тебе between не то же самое, что пара неравенств с ANDМожно ли Вас понимать так, что
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select  
  ...
from
  a join b on 
      (a.a_id = b.a_id and a.date_apply >= b.date_from  and a.date_apply <= b.date_to) 
   join c on
      (b.b_id = c.b_id and ...........) and
  .....
выглядит более кошерно в свете определения тета-соединения, чем
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select  
  ...
from
  a join b on 
      (a.a_id = b.a_id and a.date_apply between b.date_from and b.date_to) 
   join c on
      (b.b_id = c.b_id and ...........) and
  .....
?
Или мое непонимание сути проблемы гораздо глубже ?

P.S. Уважаемый mir, будьте любезны, в следующий раз использовать аргументы несколько более содержательные, чем пора, ребята, перечитать .
P.P.S. Напомните также, если несложно, какие условия правильно писать в ON, а какие в WHERE в случае внешних объединений, которые, если правильно понимаю, не относятся к тета-соединениям. В крайнем случае, укажите какой-либо доступный источник, в котором есть более весомые утверждения, чем mirФильтру -- фильтрово, джойну -- джойново.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33563317
mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Готов признать, что по поводу тета-соединени я поторопился и был более категоричен, чем следует. Дело тут в чем. Оказывается, в литературе, как я обнаружил, есть разные определения Θ-соединения.

Я ориентировался на определение, данное Дейтом в книге "Введение в системы баз данных". Если коротко, оно заключается в том, что условие соединения имеет вид (a Θ b), где a и b - имена атрибутов соединяемых отношений A и B, а Θ - операция сравнения (=, <, <=, <>, >, >=).

Аналогичное определение дает C. Кузнецов . (Естественно, если соединение идет по нескольким атрибутам, то используется умножение нескольких условий, по числу пар атрибутов).

В то же время в книге Гарсиа-Молина/Ульман/Уидом "Системы баз данных. Полный курс" дается несколько иное определение, при котором условие Θ-соединения не обязательно имеет вид (a Θ b), а может быть любым выражением. (Непонятно, правда, при чем здесь тогда тета).

Таким образом, если принять за истину первый вариант, я прав. Если второй -- нет. Теперь -- мир?
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33563422
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я безусловно уважаю С. Кузнецова, у которого учился и которого считаю отличным преподавателем, и в том числе поэтому хотел бы подчеркнуть, что его определение ничуть не ограничивает сказанное мной в данном случае. Если, как Вы сами говорите, возможно соединение по нескольким парам атрибутов, никто не мешает (в определении нет такого запрета) соединить по парам (a, a) - (b1, b2).

Я бы сказал, в процитированном определении дается попытка как раз дать такой формальный критерий отличия операции соединения от операции ограничения - соединение есть логическая операция над атрибутами разных отношений, ограничение есть логическая операция над атрибутом и константой (ну и - не помню, упомянуто там или нет - над атрибутами одного отношения).

Вот с такой постановкой вопроса я уже не соглашусь (безусловно признавая, что она существует, я бы просто поспорил с полезностью такой теории). Я полагаю, что суть важнее формы; в частности, я не вижу разницы (в том числе с точки зрения реализации хорошей БД) между запросами, например

Код: plaintext
1.
2.
select * from a where a.id =  5 

select * from a join (select  5  id from dual) b on (a.id = b.id)

или

Код: plaintext
1.
2.
select * from a join b on (a.id = b.id and b.type =  5 )

select * from a join (select * from b where type =  5 ) b on (a.id = b.id)
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33563475
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoПользователю SQL лучше об этом думать - он же работает с реляционной БД. И если не будет об этом думать, то может не увидеть из-за деревьев леса.
Объясните, пожалуйста, какого именно леса (нуждающегося во внимании) не увидит пользователь. "Формально разные операции" - пользователю согласитесь, пользователю интересно не более, нежели формальная разница между целочисленным и вещественным сложением.

Мало того, сама формальная разница - сомнительна. Вольно пересказывая того же Кузнецова - операция соединения не относится к базовым, реализуема через базовые и упоминается лишь потому, что является практически очень важным частным случаем.

vadiminfoТ.е. вы говорите, что они смешаны, а потом что полнвина в join половина в where.
Я этого не говорю. Я говорю, что в данном примере придется либо свалить все в невоспринимаемую кучу в join, либо таки использовать where для записи части условий соединения.

vadiminfo softwarer
Это редко существенно, и в этих редких случаях никто не мешает использовать скобки.

Но эти редкие случаи могут приводить к ошибкам и большей возне при выяснении почему не правильно работает запрос?
Не более чем в join-синтаксисе. Например, лично я не отношу к "интуитивно понятным" тот факт, что в запросе

Код: plaintext
1.
2.
select *
from a left join b on (a.id = b.id)
where b.type =  5 

в результате запросто окажутся записи с b.type, отличным от 5.

vadiminfoИ еще более позднему выявлению, что он не правильно работает - при тестировании того плохого случая не нашли.
Лучше скажите, что не всегда проводится тестирование. Тестера, который это пропустил, нужно немедленно увольнять по профнекомпетентности; такие ошибки находятся просто взглядом на текст select-а, и бросить этот взгляд - прямая обязанность тестера (предлагаю не обсуждать подход черного ящика).

Да, программист может сделать ошибку, в том числе и здесь. Особой опасности ошибки именно здесь я не вижу; цену, которую Вы предлагаете заплатить, считаю несоразмерной.

vadiminfo softwarer
Хм. Уже затронул выше - при свободе выражения мысли в WHERE примирить можно; в прокрустовом синтаксисе JOIN сманеврировать просто нечем

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

Я бы предпочел, чтобы Вы явно сказали "меня это не убеждает, потому что <контрпример>". Впрочем, спорить с точкой зрения я не собираюсь; игнорируете - так игнорируйте.

vadiminfoТак что же Вы предпочтете, читая чужей код - кривоватую мысль явно выраженную, или кривоавтую, но не явно выраженную?
Я предпочитаю прямую и удобно выраженную. Я пока что не встречал случая, где этого не удавалось достичь в where-синтаксисе. Я встречал случаи, где [мне] не удавалось этого достичь в join-синтаксисе. Далее?

vadiminfoЯ не думаю что в 80% испортим себе жизнь,
OK. Собственно, что я сказал чуть выше. Но давайте все же четко зафиксируем: то ли Вы "не думаете", то ли Вы приводите какие-либо аргументы. Ссылка "смотрел в литературу" без упоминания сути увиденного, честно говоря, для меня аргументом не является.

vadiminfoа вот в 20% улучшим - тут и Вы согласны?
Нет, не согласен, и нигде такого не говорил - я сказал "Вы доказываете, что" и предложил допустить истинность этого в рамках одного локального рассуждения. Если Вы не согласны со вторым постулатом, на котором основано это рассуждение, оно становится недействительным и я не вижу никаких причин соглашаться с этим выделенным утверждением и со следующими из него выводами.

vadiminfoЯ даже иду на то, что расписываю вместо таблов подзпросы ради NATURAL JOIN.
Думаю, это точка, на которой можно остановиться. Увидев natural join в боевом коде, лично я испытаю сильное желание выкинуть автора этого кода за дверь.

vadiminfoПлюс подзапросы для тежелых запросов выношу в WITH.
Аналогично. Впрочем, они расписывались и во FROM - но в WITH они в первую очередь делают запрос лучше читаемым (облегчают основной запрос). Ну и само собой, дают весьма полезные дополнительные возможности.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33563809
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerНе более чем в join-синтаксисе. Например, лично я не отношу к "интуитивно понятным" тот факт, что в запросе

Код: plaintext
1.
2.
select *
from a left join b on (a.id = b.id)
where b.type =  5 

в результате запросто окажутся записи с b.type, отличным от 5.
Опа - как это у нас получится ? Данный запрос в итоге с учетом наложение на внешнее соединение фильтра будет эквивалентен прямому соединению и к примеру в ASA так и будет стоять INNER JOIN в плане запросов (что есть логично и правильно).
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33563817
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати еще интересно, как написать через WHERE аналог такого джойна:
авторSELECT *
FROM a
LEFT JOIN (b INNER JOIN c ON c.b_id = b.id) ON b.a_id = a.id
Особенно когда хочется, чтобы в плане запросов "b" и "c" шли прямым соединением, а "b" и "a" внешним, что бывает актуально при соединении таблиц с большим числом записей в сложных запросах.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33563845
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSОпа - как это у нас получится ?
Хм. И в самом деле любопытно. Утром у меня получилось :) Давайте пока примем в качестве рабочей гипотезы, что я был очень непроснувшимся, а я попробую повторить тот эксперимент, который дал такой результат. Утром он меня тоже удивил, но я решил, что это фича :)

OK, тогда скажу то, что собственно говоря собирался сказать до этого эксперимента - я не вижу разницы в легкости внести ошибку между вариантами

Код: plaintext
1.
2.
3.
4.
5.
6.
select *
from a, b
where a.id = b.id (+) and  5  = b.type 

select *
from a left join b on a.id = b.id
where b.type =  5 

А насчет "интересно" - если мне не изменяет память, я показал это еще в прошлом обсуждении, где Вы задали такой же вопрос.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33564095
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mirТаким образом, если принять за истину первый вариант, я прав. Если второй -- нет.Мне по-прежнему хотелось бы получить от Вас четкий критерий, когда условия помещаются в ON, а когда в WHERE, и не только в случае тета-соединения. Мой вариант был изложен ранее , теперь хотелось бы увидеть Ваш. Уверен, что он будет теоретически более строг и однозначен, в отличие от моего.
P.S. По поводу различия определений тета-соединения. IMHO, главное и общее во всех них то, что условие Θ-соединения представляет собой некую функцию над столбцами участвующих отношений, которая должна возвращать TRUE для соответствующих пар кортежей, а не применимость between в этом контексте в сравнении с = , > , < , и т.д.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33564100
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Объясните, пожалуйста, какого именно леса (нуждающегося во внимании) не увидит пользователь. "Формально разные операции" - пользователю согласитесь, пользователю интересно не более, нежели формальная разница между целочисленным и вещественным сложением.

Не увидит концептуальной последовательности операций в сложном запросе, погрязнет в деталях. Алгебра есть алгебра. Вам не приходится разъяснять парням, почему сумма значений просто в табле меньше, чем таже у сумма после того как они соединили много таблов с данной таблой (дубли соединения) на бумаге? Вот от того, что им не «интересно» было. Иногда они часами мучаются, не могут объяснить результатов того, что написали. Хорошо, если увидят вообще, что там что-то не то. А мне приходится периодически.

softwarer
Мало того, сама формальная разница - сомнительна. Вольно пересказывая того же Кузнецова - операция соединения не относится к базовым, реализуема через базовые и упоминается лишь потому, что является практически очень важным частным случаем.

Кузнецова не читал. Но читал, например, Мейера «Теория реляционных БД» и др.. Там про реализацию через «базовые» не припомню. Если «базовые» операции - это выборки (WHERE), то они - унарные, а соединение – бинарная операция. Или Вы к базовым относите Декартово произведение? Все-таки оно в рел алгебре лучше смотрится как частный случай соединения. Причем как Вы сказали, соединения очень важная операция. Достойная рассмотрения как отдельной, даже если ее вывели из "базовых". В частности, она может приводить к потере информации (дублям, которых не ждали), если не принимать особых мер. Внешние соединения еще хуже воспринимаются как порожденные от «базовых».
softwarer
Я говорю, что в данном примере придется либо свалить все в невоспринимаемую кучу в join, либо таки использовать where для записи части условий соединения.

Почему Вы считаете, что куча в where лучше кучи в join, тем более что в where есть еще что-то – она как бы больше в данном примере.
softwarer

Например, лично я не отношу к "интуитивно понятным" тот факт, что в запросе …
в результате запросто окажутся записи с b.type, отличным от 5.


В этом примере очень наглядно прописано внешнее соединение left. Поэтому «интуитивное» здесь уже лишнее – все и так очевидно. А вот (+) в Оракле или (*) в Скуле, которые, насколько я помню, совершенно по разному действуют в плане левого и правого и находятся в WHERE, а не рядом с JOIN значительно менее семантичны, да и неожиданны – надо запоминать как они работают. Тут нет, нет да и без интуиции иной раз и не обойтись

softwarer

Лучше скажите, что не всегда проводится тестирование. Тестера, который это пропустил, нужно немедленно увольнять по профнекомпетентности; такие ошибки находятся просто взглядом на текст select-а, и бросить этот взгляд - прямая обязанность тестера (предлагаю не обсуждать подход черного ящика).

Конечно, я могу сказать легко, что не всегда проводится тестирование. Что тестеров увольнять не получится – их и так нет. Во взгляды на select в сложных случаях не верю – нужно подставлять таблы заполненные по разному. Но ведь речь шла о том, чтобы упростить тестирование, сопровождение, да и разработку.

softwarer

Да, программист может сделать ошибку, в том числе и здесь. Особой опасности ошибки именно здесь я не вижу; цену, которую Вы предлагаете заплатить, считаю несоразмерной.

Во-первых, не тока я предлагаю. Как бы еще кое-кто, включая Оракла, про Скуль молчу – там еще раньше Джойны появились. Про стандарты тем более – там просто нет другого синтаксиса для внешних соединений. Во-вторых, насчет несарозмерности – не очевидно. Мне все еще кажется (+) не очень сарозмерным в принципе. А для внутренних соединений Джойны строже, но это – дело стиля. Все-таки – явно паписть «Соеденить таблы», чем перечислить их через запятую побольше смысл операции виден будет.


softwarer
Насколько я вижу, Вы просто проигнорировали приведенный мной пример, как впрочем и другие.

Да нет. Просто я на нем только лишний раз убедился в большей строгости синтаксиса с join. Соединяются таблы а и b и все правила соединения прописаны в одном месте, где и ожидаются: в условиях на соединения. Потому и не стал ничего говорить: Вы можете сказать – это субъективно.
softwarer
Я бы предпочел, чтобы Вы явно сказали "меня это не убеждает, потому что <контрпример>". Впрочем, спорить с точкой зрения я не собираюсь; игнорируете - так игнорируйте.


Я уверен, что Вы очень хорошо знаете предмет, чтобы мне приводить примеры. Меня это не убеждает, потому что пока Ваши примеры мне очень нравятся в поддержку синтаксиса JOIN.
softwarer
Я предпочитаю прямую и удобно выраженную.

Но что это значит? «Прямая», «удобно выраженная»? Что там прямого и удобного? Да там более упрощенный синтаксис. Но не за счет ли строгости? То бишь прямоты? А удобно написать (проще), не всегда удобно прочитать – не ясно что хотел, мож просто ошибся, а мож так и надо.
softwarer
Я пока что не встречал случая, где этого не удавалось достичь в where-синтаксисе. Я встречал случаи, где [мне] не удавалось этого достичь в join-синтаксисе.

Я не сомневаюсь, что Вам удавалось. И мне трудно представить, чтобы Вам не удалось. Или Вы имеете в виду те примеры? Мне кажется, Вам удалось и очень хорошо все выразить прямо и удобно, по крайней мере для меня.
softwarer
OK. Собственно, что я сказал чуть выше. Но давайте все же четко зафиксируем: то ли Вы "не думаете", то ли Вы приводите какие-либо аргументы. Ссылка "смотрел в литературу" без упоминания сути увиденного, честно говоря, для меня аргументом не является.

Согласен. Но Вы тоже сказали просто, что в 80% ухудшим себе жизнь. А я так же сказал, что особо не испортим, а может еще и улучшим. Кто будит считать все случаи на практике за нашей спиной и считать их испорченными или нет? Тут аргументированность по любому слабая с обоих сторон.

softwarer
Нет, не согласен, и нигде такого не говорил

Значит я не так понял фразу – про ради 20% испортить жизнь в 80 %.

softwarer
Думаю, это точка, на которой можно остановиться. Увидев natural join в боевом коде, лично я испытаю сильное желание выкинуть автора этого кода за дверь.


Выкидывать кого-то за дверь – мне не известные желания. Если natural join написан без проекций в подзапросах, исключающих «неожиданные» условия соединения, которые могут появиться позже – добавили новые поля с одинаковыми именами, то да я против такого. И не рекомендую использовать это начинающим в боевом коде, пока они не представляют себе всех последствий. В противном случае исключение вообще условий на соединения, особенно тех, что Вы называете основными – значительно улучшает чтение запроса. Т.е. пропадает вообще вопрос от том что куда переносить. О чем мы говорили выше. Поди плохо?
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33564118
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerне вижу разницы в легкости внести ошибку между вариантами
Оригинальный подход к сравнению синтаксиса. Хотя из этого может следовать отсутствие различия даже между разными языками. Мощно, стоит запатентовать.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33564219
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChAОригинальный подход к сравнению синтаксиса.
Вот поэтому я не люблю беседовать на флеймовые темы с несколькими людьми одновременно. Обязательно рано или поздно кто-нибудь выхватит фразу из контекста.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33564527
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то все запутано у вас выходит. IMHO в общем случае вопрос о том где писать условия в where или inner join - это вопрос вкуса (внутренних соглашений фирмы и т.д.). Хотя даже в этом случае эквивалентные запросы могут давать разные планы исполнения. Но что касается внешних соединений, то ответ на вопрос по-моему уже давно содержится в BOL к MS SQL:
BOL MS SQL 2000In earlier versions of Microsoft® SQL Server™ 2000, left and right outer join conditions were specified in the WHERE clause using the *= and =* operators. In some cases, this syntax results in an ambiguous query that can be interpreted in more than one way. SQL-92 compliant outer joins are specified in the FROM clause and do not result in this ambiguity
Так о чем идет спор?
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33564541
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркНо что касается внешних соединений, то ответ на вопрос по-моему уже давно содержится в BOL к MS SQL
Еще во время прошлого обсуждения этого вопроса было показано, что убогая реализация *= в MSSQL никоим образом не является аргументом при обсуждении чего-либо кроме MSSQL. Повторять двадцать страниц того топика, честно говоря, не хочется; пожалуйста воспользуйтесь поиском (это было в "Сравнение СУБД", название топика к сожалению не помню).
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33564806
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerЕще во время прошлого обсуждения этого вопроса было показано, что убогая реализация *= в MSSQL никоим образом не является аргументом при обсуждении чего-либо кроме MSSQL. Повторять двадцать страниц того топика, честно говоря, не хочется; пожалуйста воспользуйтесь поиском (это было в "Сравнение СУБД", название топика к сожалению не помню).
Если Вы про это /topic/7615&pg=17 то все равно не понял. Ткните пальцем, где там про убогую реализацию *= в MS SQL и почему именно из-за этой особенности реализации появляется неоднозначность. Она и в Oracle c (+) должна быть, насколько я понимаю. И скобками в where делу не поможешь, хоть все по 10 раз в них заверни ибо операция и не ассоциативна и не коммутативна.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33564822
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркЕсли Вы про это
Нет, не про это. Вроде как обсуждение было не так давно; беседовали мы в основном с pkarklin , и в итоге он не смог привести примера, который я бы не смог корректно реализовать с использованием (+)

Локшин МаркИ скобками в where делу не поможешь
А кто говорит про скобки в where? :))
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33564876
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerНет, не про это. Вроде как обсуждение было не так давно; беседовали мы в основном с pkarklin, и в итоге он не смог привести примера, который я бы не смог корректно реализовать с использованием (+)
Что-то не нашел, где вы там с ним чего выясняли, кнопочка все (с некоторых пор???) на больших темах не работает, а лазить по всем и нажимать постранично как-то не удобно и долго выходит. Но по-моему вот простейший пример (ну или ссылку тогда на тему дайте, если это уже было):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create table a (f int)
create table b (f int)
create table c (f int)

insert into a (f) values ( 1 )
insert into a (f) values ( 2 )
insert into a (f) values ( 3 )
insert into a (f) values ( 3 )

insert into b (f) values ( 1 )
insert into b (f) values ( 1 )
insert into b (f) values ( 2 )

insert into c (f) values ( 2 )
insert into c (f) values ( 3 )

select * from (a left outer join b on a.f = b.f) left outer join c on b.f = c.f and a.f = c.f
select * from a left outer join (b left outer join c on b.f = c.f) on a.f = b.f and a.f = c.f
Вроде и с одной стороны это
Код: plaintext
1.
2.
3.
4.
select * 
from a,b,c
where a.f *= b.f 
      and b.f *= c.f
      and a.f *= c.f
и с другой...
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33564885
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Марк
Код: plaintext
1.
select * from (a left outer join b on a.f = b.f) left outer join c on b.f = c.f and a.f = c.f

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
select
  d.a_f, 
  d.b_f,
  c.f
from
  (select a.f a_f, b.f b_f from a, b where a.f = b.f (+)) d,
  c
where
  d.a_f = c.f (+) and
  d.b_f = c.f (+)
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33564904
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Марк
Код: plaintext
1.
2.
3.
4.
select * 
from a,b,c
where a.f *= b.f 
      and b.f *= c.f
      and a.f *= c.f

Кстати, отмечу, что в случае Oracle здесь никакой неоднозначности не будет - будет ошибка. Что пожалуй правильнее.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33565127
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerКстати, отмечу, что в случае Oracle здесь никакой неоднозначности не будет - будет ошибка. Что пожалуй правильнее.
Ну так и в MS SQL тоже будет на этот запрос:
Код: plaintext
1.
Server: Msg  301 , Level  16 , State  1 , Line  1 
Query contains an outer-join request that is not permitted.
По поводу вашего варианта. Запросы то эквивалентные, но это извините не только соединение в условии фильтрации, а соединение в условии фильтрации + еще и подзапрос с соединением в условии фильтрации. Что как-бы вещи IMHO немного разные. Я не говорю, про чисто субъективную вещь как это будет смотреться при 5-6 последовательных outer join' ах. Но от таких вот выкрутасов оптимизатор у вас в какой-нибудь раз забудет об индексе/статистике за счет нескольких вложенноых подзапросов и привет. Зачем усложнять жизнь и себе и оптимизатору?
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33565403
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркНу так и в MS SQL тоже будет на этот запрос:
А к чему тогда относится ранее процитированная фраза насчет возможности неоднозначной интерпретации?

Локшин МаркПо поводу вашего варианта. Запросы то эквивалентные,
Я бы особо отметил, что не просто запросы эквивалентные, но и их алгебраическая запись одинакова.

Локшин Маркно это извините не только соединение в условии фильтрации, а соединение в условии фильтрации + еще и подзапрос с соединением в условии фильтрации. Что как-бы вещи IMHO немного разные.
Чем именно? Ваши скобки в join-е - это ровно такой же подзапрос, просто неявно оформленный.

Локшин МаркЯ не говорю, про чисто субъективную вещь как это будет смотреться при 5-6 последовательных outer join' ах.
И все неоднозначные? Не уверен, что хоть раз в жизни встречал такой запрос :)

Я бы хотел сразу определить обсуждаемое утверждение. Если мы говорим о "лучшем варианте синтаксиса в той или иной ситуации", я согласен с тем, что в некоторых ситуациях join-синтаксис предпочтительнее. Если мы сравниваем синтаксисы, так или иначе говорим о "лучше было бы везде использовать единый синтаксис, и это должен быть такой-то", то повторю - любой аргумент вида "лучше в 1% случаев" должен быть очень весок, чтобы перебороть "хуже во всех оставшихся случаях".

Локшин МаркНо от таких вот выкрутасов оптимизатор у вас в какой-нибудь раз забудет об индексе/статистике
Хм. Обещаете?

Вот тут я сошлюсь на сказанное выше - у этих запросов одинаковая алгебраическая запись. Если бы мои программисты принесли мне оптимизатор, способный построить для них разные планы - я бы послал их.... переделывать работу с начала. Потому что это означает принципиально некорректное проектирование оптимизатора.

Простите, но даже думать об этом варианте не вижу смысла. Впрочем, заодно для полноты картины могу подкинуть контрпример, относящийся как раз к попытке исправить "неправильное поведение оптимизатора". В where-синтаксисе возможно написать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
select /*+ first_rows */
  d.a_f, 
  d.b_f,
  c.f
from
  (select /*+ all_rows */ a.f a_f, b.f b_f from a, b where a.f = b.f (+)) d,
  c
where
  d.a_f = c.f (+) and
  d.b_f = c.f (+)

Было бы интересно посмотреть на аналогичную запись в случае ansi join-ов.

Локшин МаркЗачем усложнять жизнь и себе и оптимизатору?
Ну в общем-то см. выше.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33566899
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerА к чему тогда относится ранее процитированная фраза насчет возможности неоднозначной интерпретации?
Ну такая запись дает возможность неоднозначной трактовки запроса, что тут не понятного.
softwarerЯ бы особо отметил, что не просто запросы эквивалентные, но и их алгебраическая запись одинакова.
А я бы этого не отмечал, так как это не верно. Как-то Вы так лихо выкинули оператор переименования атрибутов и отношения. Ни разу она и не одинакова.
softwarerЧем именно? Ваши скобки в join-е - это ровно такой же подзапрос, просто неявно оформленный.
Join - это join, а подзапрос - это подзапрос. А Left join - это left join. Всем изместно, что система опраторов реляционной алгебры не минимальна, и одни выражаются через другие.
softwarerЕсли мы сравниваем синтаксисы, так или иначе говорим о "лучше было бы везде использовать единый синтаксис, и это должен быть такой-то", то повторю - любой аргумент вида "лучше в 1% случаев" должен быть очень весок, чтобы перебороть "хуже во всех оставшихся случаях".
А зачем хуже? Достаточно - лучше в некоторых, и не хуже в остальных.
softwarerХм. Обещаете?

Вот тут я сошлюсь на сказанное выше - у этих запросов одинаковая алгебраическая запись. Если бы мои программисты принесли мне оптимизатор, способный построить для них разные планы - я бы послал их.... переделывать работу с начала. Потому что это означает принципиально некорректное проектирование оптимизатора.
Обещаю, более того, наблюдал такое поведение в MS SQL, правда на более сложных запросах. И запись, как выясняется, вовсе не одинаковая. И программистов никто не посылает...
По поводу примера, что за хинты такие
Код: plaintext
1.
/*+ all_rows */ 
/*+ first_rows */
а то я не слишком сильно силен в Oracle. А то по ANSI стандарту этот запрос просто эквивалентен первому :)
Ну а про ответ, я думаю, Вы догадываетесь?
Код: plaintext
1.
2.
3.
4.
5.
6.
select /*+ first_rows */
  d.a_f, 
  d.b_f,
  c.f
from
  (select /*+ all_rows */ a.f a_f, b.f b_f from a left outer join b on a.f = b.f ) d
  left outer join c on d.a_f = c.f and d.b_f = c.f
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33567328
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Марк softwarerА к чему тогда относится ранее процитированная фраза насчет возможности неоднозначной интерпретации?
Ну такая запись дает возможность неоднозначной трактовки запроса, что тут не понятного.
Трактовки кем? Сервером? Так вроде бы согласно последней версии сказанного Вами он трактует такой запрос однозначно и правильно - как ошибочный. Трактовки программистом? Хм, какая собственно разница, как именно он трактует ошибочный запрос? Кем еще?

Локшин МаркКак-то Вы так лихо выкинули оператор переименования атрибутов и отношения.
Переименование появилось только потому, что Вы использовали звездочку, что в нормальном коде недопустимо само по себе. В нормальной записи Вашего варианта было бы то же переименование.

Локшин МаркВсем изместно, что система опраторов реляционной алгебры не минимальна, и одни выражаются через другие.
По-Вашему получается, что не "всем", но "всем, кроме оптимизатора". Который почему-то обязан от этого сглупить.

Локшин Марк softwarerЕсли мы сравниваем синтаксисы, так или иначе говорим о "лучше было бы везде использовать единый синтаксис, и это должен быть такой-то", то повторю - любой аргумент вида "лучше в 1% случаев" должен быть очень весок, чтобы перебороть "хуже во всех оставшихся случаях".
А зачем хуже? Достаточно - лучше в некоторых, и не хуже в остальных.
Было бы достаточно. Но поскольку "не хуже в остальных" отсутствует - недостаточно.

Локшин МаркОбещаю, более того, наблюдал такое поведение в MS SQL, правда на более сложных запросах.
Хм. Вы кажется обещали, что оптимизатор навернется "у меня", а не "в MS SQL". Если говорить о последнем - согласно утверждениям pkarklin *= в нем просто плохо реализован (недостаточно функционален). Лично я сделал в MSSQL один проект, имея целью в основном пощупать работу с ним, и ничуть не огорчусь, если больше никогда не доведется иметь с ним дело.

Локшин МаркНу а про ответ, я думаю, Вы догадываетесь?
Догадываюсь. Привел как раз чтобы показать, что с точки зрения "управления оптимизатором" продемонстрированное Вами преимущество имеет и оборотную сторону, и приходится таки использовать запись "в моем стиле".
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33567488
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerТрактовки кем? Сервером? Так вроде бы согласно последней версии сказанного Вами он трактует такой запрос однозначно и правильно - как ошибочный. Трактовки программистом? Хм, какая собственно разница, как именно он трактует ошибочный запрос? Кем еще?
Так потому что такой способ записи порождает неоднозначности в интерпритации запроса, что есть очень плохо - значит способ записи дурной. Было бы весьма странно, если бы сервер его исполнял то так, то этак.

softwarerПереименование появилось только потому, что Вы использовали звездочку, что в нормальном коде недопустимо само по себе. В нормальной записи Вашего варианта было бы то же переименование.
Да?
Код: plaintext
1.
select a.f,b.f,c.f
from (a left outer join b on a.f = b.f) left outer join c on b.f = c.f and a.f = c.f
Ну и где? Где отношение d? Где переименование?
softwarerПо-Вашему получается, что не "всем", но "всем, кроме оптимизатора". Который почему-то обязан от этого сглупить.
Если Вы думаете, что оптимизатору преобразовать запрос к эквивалентному, который быстрее выполняется очень просто, то Вы ошибаетесь. Так зачем его еще и путать лишний раз?
softwarerВы кажется обещали, что оптимизатор навернется "у меня", а не "в MS SQL".
Уверен, что рано или поздно и в Oracle навернется.
softwarerДогадываюсь. Привел как раз чтобы показать, что с точки зрения "управления оптимизатором" продемонстрированное Вами преимущество имеет и оборотную сторону, и приходится таки использовать запись "в моем стиле".
Ммм... эээ.... а где я говорил, что я не использую подзапросов?
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33567633
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркТак потому что такой способ записи порождает неоднозначности в интерпритации запроса, что есть очень плохо - значит способ записи дурной. Было бы весьма странно, если бы сервер его исполнял то так, то этак.
Хм. Я перестал понимать, то ли я идиот, то ли Microsoft так старательно затуманил простую вещь, то ли это делаете Вы. Насколько я вижу, Вы говорите примерно следующее: "выражение 1/0 не может быть однозначно интерпретировано, а следовательно способ записи a/b дурной". Я этой логики не понимаю, поэтому предлагаю свернуть эту часть обсуждения.

Да, последний вопрос: обрабатывал ли такие запросы MSSQL когда-нибудь или таки во всех версиях выдавал ошибку?

Ну и где? Где отношение d? Где переименование?
Кажется, наконец-то до меня дошло, что Вы уделяете очень большое значение форме. Увы, в рамках такой концепции ответить не смогу, поскольку предпочитаю говорить о сути.

В моем понимании мира - отношение d внутри скобок, а переименование там, где этот селект будет использован.

Локшин МаркЕсли Вы думаете, что оптимизатору преобразовать запрос к эквивалентному, который быстрее выполняется очень просто, то Вы ошибаетесь.
Если Вы полагаете, что я имел в виду именно это, то Вы ошибаетесь; если не полагаете, то наводите тень на плетень.

Я полагаю, что любой хороший алгоритм обязан на эквивалентных данных давать одинаковый результат. Гиперболизируя - если алгоритм зависит от того, записана ли в SQL константа как "1", "1.0" или "1E0", это хреновый алгоритм.

Локшин МаркТак зачем его еще и путать лишний раз?
Кстати, почему Вы считаете "путать"? Если есть неэквивалентность - 50% шансов за то, что именно "моя" запись даст более эффективный план.

Локшин МаркУверен, что рано или поздно и в Oracle навернется.
Ну.. удачи. Как я понимаю, Вы предлагаете ухудшать каждое приложение, основываясь на лично Вашей уверенности, что "иначе рано или поздно навернется". Для меня это чем-то сродни предложению окружать каждую подпрограмму пустым блоком отлова исключений.

Локшин МаркМмм... эээ.... а где я говорил, что я не использую подзапросов?
А где я говорил, что Вы их не используете?

Вы показали, что "такая запись может быть лучше, потому что". Я показал, что она по этой же причине может быть хуже. Какой из этого следует вывод? С моей точки зрения - "этот аргумент не позволяет судить о преимуществах той или иной записи".
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33567963
mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChA mirТаким образом, если принять за истину первый вариант, я прав. Если второй -- нет.Мне по-прежнему хотелось бы получить от Вас четкий критерий, когда условия помещаются в ON, а когда в WHERE, и не только в случае тета-соединения. Мой вариант был изложен ранее , теперь хотелось бы увидеть Ваш. Уверен, что он будет теоретически более строг и однозначен, в отличие от моего.
P.S. По поводу различия определений тета-соединения. IMHO, главное и общее во всех них то, что условие Θ-соединения представляет собой некую функцию над столбцами участвующих отношений, которая должна возвращать TRUE для соответствующих пар кортежей, а не применимость between в этом контексте в сравнении с = , > , < , и т.д.Ну, во-первых, я ни в коем случае не считаю себя мега-экспертом. И не стесняюсь признать неправоту, если что. Теперь по вопросу. Сначала лирическое отступление. Я четко осознаю, что рел. алгебра избыточна (как, кстати, и практически любая алгебра). И возможных базисов операций в ней несколько. Однако это не повод использовать только некоторый выбранный базис. Операция соединения настолько распространена, что использовать для нее специальный синтаксис вполне оправдано. Далее, для определения того, что выносить именно во FROM (то есть в JOIN), просто придерживаюсь определений. Для эквисоединения (хоть внутреннего, хоть внешнего) все понятно: условие равенства атрибутов (a=b) или нескольких пар атрибутов (a=b) AND (c=d). Для тета-соединения использую только условия вида (a Θ b), где Θ - операция сравнения. То есть строго по тому определения, которое я всегда считал единственным.
Все остальные условия выношу в WHERE.
Считаю, что это позволяет сделать запрос нагляднее: обычно быстро пробежал глазами по FROM, понял что с чем соединяется, а потом в WHERE осмысляю все остальные условия выборки.
По моему личному опыту, другие варианты нескольку усложняют чтение. А другие варианты -- это либо заталкивать абсолютно все в WHERE, либо перегружать FROM более сложными условиями JOIN'ов, чем классическое сравнение значений пар атрибутов.
В целом, для меня это не принципиальный вопрос. Удивлен, что по нему целая дискуссия. Удивлен, что есть радикалы (softwarer), с фразами вроде "Увидев natural join в боевом коде, лично я испытаю сильное желание выкинуть автора этого кода за дверь." Такое значение незначительному вопросу? Это что-то больше психологическое, чем технологическое.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33568100
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mirУдивлен, что есть радикалы (softwarer), с фразами вроде "Увидев natural join в боевом коде, лично я испытаю сильное желание выкинуть автора этого кода за дверь." Такое значение незначительному вопросу? Это что-то больше психологическое, чем технологическое.
Вы, безусловно, можете считать это незначительным вопросом. Я же считаю это непониманием технологии разработки качественного программного обеспечения. Запрос, использующий natural join в любом его виде, может быть затронут (стать неверным) из-за мелкого изменения в БД либо в удаленной по тексту части этого запроса. Его использование в боевом коде - примерно то же, что передача параметров подпрограммы через разделяемые глобальные переменные.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33568175
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mirСчитаю, что это позволяет сделать запрос нагляднее: обычно быстро пробежал глазами по FROM, понял что с чем соединяется, а потом в WHERE осмысляю все остальные условия выборки.Пример
Код: plaintext
1.
2.
3.
SELECT a.*
FROM a
LEFT JOIN b ON (b.aid = a.id AND b.Type =  1 )
WHERE b.ID IS NULL
Надеюсь очевидно, что переместить
Код: plaintext
b.Type =  1 
из ON в пункт WHERE с получением эквивалентного результата невозможно ? Спич к тому, что не так все просто и однозначно. В случае INNER без разницы, где условия, в ON или WHERE - результат одинаков. Но если JOIN - OUTER, что бывает на практике достаточно часто, то ситуация сильно меняется. B ON может понадобится указать и то, что обычно считается фильтром. Т.е., кроме условия соединения указывается еще и ограничивающие условие для этого отношения, в некотором смысле, более краткий и понятный вариант derived table.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33568637
mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChA mirСчитаю, что это позволяет сделать запрос нагляднее: обычно быстро пробежал глазами по FROM, понял что с чем соединяется, а потом в WHERE осмысляю все остальные условия выборки.Пример
Код: plaintext
1.
2.
3.
SELECT a.*
FROM a
LEFT JOIN b ON (b.aid = a.id AND b.Type =  1 )
WHERE b.ID IS NULL
Надеюсь очевидно, что переместить
Код: plaintext
b.Type =  1 
из ON в пункт WHERE с получением эквивалентного результата невозможно ? Спич к тому, что не так все просто и однозначно. В случае INNER без разницы, где условия, в ON или WHERE - результат одинаков. Но если JOIN - OUTER, что бывает на практике достаточно часто, то ситуация сильно меняется. B ON может понадобится указать и то, что обычно считается фильтром. Т.е., кроме условия соединения указывается еще и ограничивающие условие для этого отношения, в некотором смысле, более краткий и понятный вариант derived table.Соглашусь.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33568657
mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer mirУдивлен, что есть радикалы (softwarer), с фразами вроде "Увидев natural join в боевом коде, лично я испытаю сильное желание выкинуть автора этого кода за дверь." Такое значение незначительному вопросу? Это что-то больше психологическое, чем технологическое.
Вы, безусловно, можете считать это незначительным вопросом. Я же считаю это непониманием технологии разработки качественного программного обеспечения. Запрос, использующий natural join в любом его виде, может быть затронут (стать неверным) из-за мелкого изменения в БД либо в удаленной по тексту части этого запроса. Его использование в боевом коде - примерно то же, что передача параметров подпрограммы через разделяемые глобальные переменные.Нельзя ли привести пример изменения в БД, которое може повлиять только на запросы с natural join и больше ни на что? Про "удаленную по тексту часть этого запроса", честно, не понял.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33569172
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerХм. Я перестал понимать, то ли я идиот, то ли Microsoft так старательно затуманил простую вещь, то ли это делаете Вы. Насколько я вижу, Вы говорите примерно следующее: "выражение 1/0 не может быть однозначно интерпретировано, а следовательно способ записи a/b дурной". Я этой логики не понимаю, поэтому предлагаю свернуть эту часть обсуждения.
Хорошо, только на последок замечу несколько вещей насчет неуместности аналогии:
1. Выражение a/b (и 1/0) интерпретируется всегда однозначно, в отличие от...
2. Да, в школьной математике детей пугают, что на ноль делить нельзя... Заметим на 0, а на все остальные числа - можно. Т.е. какие-либо проблемы появляются при конкретных значениях переменных. Запись с *= неоднозначна при любых значениях.
3. Даже если предположить какую-то "нехорошесть" данного задания, то критерий очень простой b <>0. Как будет выглядит критерий для *= соединения? Какова сложность его проверки "в уме"?
softwarerДа, последний вопрос: обрабатывал ли такие запросы MSSQL когда-нибудь или таки во всех версиях выдавал ошибку?
За все версии MS SQL сказать не могу...
softwarerВ моем понимании мира - отношение d внутри скобок, а переименование там, где этот селект будет использован.
Ну не знаю какого там Ваше понимание мира, но чисто формально алгебраическая запись этих двух запросов разная.
softwarerЯ полагаю, что любой хороший алгоритм обязан на эквивалентных данных давать одинаковый результат. Гиперболизируя - если алгоритм зависит от того, записана ли в SQL константа как "1", "1.0" или "1E0", это хреновый алгоритм.
Тогда Вы по всей видимости должны знать, что хороших с вашей точки зрения алгоритмов исполнения запроса еще не изобретено...
Опять же, аналогия несколько натянута.
softwarerКстати, почему Вы считаете "путать"? Если есть неэквивалентность - 50% шансов за то, что именно "моя" запись даст более эффективный план.
Вы рассуждаете как в том анекдоте "Какова вероятность встретить динозавра, выйдя на улицу...". Чисто формально, для вычисления вашего запроса необходимо создать временное отношение d, поместить туда результат полусоединения a с b, и лишь только затем соединять с c. Естественно, ни один вменяемый оптимизатор в СУБД так себя не ведет.
Но, также известно, что устранение подзапросов позволяет в общем случае
генерировать более удачные физические планы исполнения запросов (ссылку на память не помню, но это из статьи с авторитетной конференции ACM). Разработано достаточно большое количество методов для устранения вложенности (здесь уже ссылки могу дать). в т.ч. и с алгебраической их трактовкой (заметьте - обратным процессом почему-то не занимаются).
softwarerНу.. удачи. Как я понимаю, Вы предлагаете ухудшать каждое приложение, основываясь на лично Вашей уверенности, что "иначе рано или поздно навернется".
Так что в свете вышесказанного я не понимаю, почему это ухудшение. Какое ухудшение? То Вы говорите что это одно и тоже, то мой вариант чем-то ухудшает приложение. Определитесь.
Ваш способ вносит дополнительную операцию, которую нужно обрабатывать оптимизатору. Зачем? Эти таблицы из подзапроса оптимизатору еще нужно будет додуматься вынести. Это хорошо, что запрос такой простой, а если в подзапросе еще чего навернуть, так это оптимизатору нужно будет еще выделить и вынести эти две таблицы из подзапроса. А если вложенность побольше сделать? Запутается, и глазом не моргнет.
softwarerЯ показал, что она по этой же причине может быть хуже.
Брр... ничего не понял. Выше я привел свой вариант, чем он хуже? Не обойтись без подзапроса - пишите подзапрос. Просто мне не нужно думать, когда *= написать, а когда left join, т.к синтаксис с *= неоднозначен и я пишу всегда left join, а не выношу соединения в подзапросы. Я лучше над другими вещами подумаю.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33570476
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркЗаметим на 0, а на все остальные числа - можно. Т.е. какие-либо проблемы появляются при конкретных значениях переменных. Запись с *= неоднозначна при любых значениях
"Значением" в случае этой операции является связываемая таблица. И запись неоднозначна далеко не при всех значениях, скорее при "очень некоторых".

Локшин МаркКак будет выглядит критерий для *= соединения?
Подключаемая по внешнему соединению таблица соединяется с одной и только с одной базовой таблицей.

Локшин МаркКакова сложность его проверки "в уме"?
Хм. Этот вопрос меня немного смущает. Дело в том, что этот критерий проверяется без участия ума, просто глазами, ну а сервер со своей стороны проведет ровно ту же проверку.

Локшин МаркТогда Вы по всей видимости должны знать, что хороших с вашей точки зрения алгоритмов исполнения запроса еще не изобретено...
Достаточно хорошие - изобретены. Идеальных, конечно, нет.

Локшин МаркОпять же, аналогия несколько натянута.
Это не аналогия, а гипербола (в моем тексте было употреблено именно это слово). Гиперболе, если угодно, по статусу положено быть несколько натянутой; ее предназначение - выпятить нечто, что в исходном объекте недостаточно заметно.

Локшин МаркВы рассуждаете как в том анекдоте "Какова вероятность встретить динозавра, выйдя на улицу...".
Безусловно. В данном случае Вы занимаете довольно категоричную позицию - "ухудшит и все тут", которой я противопоставляю столь же категоричную "а с тем же успехом и улучшит".

Скажем так, оптимизаторы имхо весьма преуспели в разворачивании подзапросов (Вы собственно говорите об этом дальше) и практически мне иногда приходилось запрещать оптимизатору такой разворот, но не припомню, чтобы приходилось понуждать его.

Локшин МаркТак что в свете вышесказанного я не понимаю, почему это ухудшение.
Наверное, мне следовало быть более аккуратным в формулировках. С точки зрения эффективности я нисколько не собираюсь настаивать на каком-то обязательном ухудшении ситуации при использовании ansi join-ов. Я в данном случае имел в виду тему более ранней части беседы - удобство их использования, читаемость запросов итп.

Локшин Марк...... А если вложенность побольше сделать? Запутается, и глазом не моргнет.
Итого: имеем некий незначительный процент запросов, на которых оптимизатор имеет шанс запутаться. Некоторые наверное таки запутаются. Имеем выбор: то ли помочь оптимизатору в конкретных редких случаях, тем же хинтом, то ли строить всю технологию под конкретный редкий случай.

Не сказал бы, что второй вариант выглядит однозначно верным выбором.

Локшин МаркБрр... ничего не понял. Выше я привел свой вариант, чем он хуже? Не обойтись без подзапроса - пишите подзапрос.
Хм. Давайте вспомним сначала. Вы обосновываете точку зрения, что join-синтаксис лучше, согласны?

Сначала Вы попытались показать, что он позволяет НЕЧТО. Я показал, что это НЕЧТО возможно и в where-синтаксисе. Тогда Вы начали обосновывать то, что вариант с подзапросом хуже. Я показал, что и в join-ах отказаться от подзапросов не удастся. Жду нового принципиального аргумента...

Если принципиальных аргументов нет - остается то, о чем говорю я, то есть аргументы количественные. Если, допустим, "скобки в 10% хуже" - это одно; если "скобки в 10% хуже, но в join-ах в 10% случаев их все равно приходится использовать" - это уже немного другое. Хотя в любом случае напальцевые рассуждения о весах, вопрос вкусов в чистом виде.

Локшин МаркПросто мне не нужно думать, когда *= написать, а когда left join, т.к синтаксис с *= неоднозначен
Вернулись к вопросам религии. Мне точно так же не нужно думать, когда писать (+), а когда left join, поскольку второй я никогда (исключая эксперименты в подобных беседах) не пишу.

Локшин МаркЯ лучше над другими вещами подумаю.
Угу. И эти вещи будут - как понять запрос, в котором относящиеся к одному и тому же условия разнесены на полторы страницы.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33581843
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerИ запись неоднозначна далеко не при всех значениях, скорее при "очень некоторых".
Я имел ввиду конкретный пример, который привел выше.
softwarerПодключаемая по внешнему соединению таблица соединяется с одной и только с одной базовой таблицей.
Маловата будет (c). Часто требуется больше. Walk around Вы продемонстрировали, но это именно (IMHO) этим и является.
softwarerДело в том, что этот критерий проверяется без участия ума, просто глазами,
Пишу запросы не выходя из коматозного состояния что-ли? Меня вот Ваш ответ смущает.
softwarerну а сервер со своей стороны проведет ровно ту же проверку.
Ну про сервер никто не говорит.
softwarerЯ показал, что это НЕЧТО возможно и в where-синтаксисе.
С введением подзапросов. Ну я left join можно и по-другому еще выразить...
softwarerТогда Вы начали обосновывать то, что вариант с подзапросом хуже. Я показал, что и в join-ах отказаться от подзапросов не удастся.
Э... погодите. IMHO у Вас все же проскакивает мысль, что я считаю, что "от подзапросов можно отказаться". Это не так, просто не нужно их (IMHO) необоснованно вводить.
softwarerУгу. И эти вещи будут - как понять запрос, в котором относящиеся к одному и тому же условия разнесены на полторы страницы.
Да и у Вас также получится с подзапросом, причем часть условий соединения во FROM, часть в WHERE перемешанные с условиями фильтрации будут.
И отношение вы переименовываете, т.е. по человеку изучая запрос нужно помнить что Вы и как переобозначили по отношению к стандартной схеме БД. Я стараюсь (при возможности, конечно) такой ситуации избегать.
PS. Ну а то, что вопросы эффективности восприятия можно отнести к "вопросам религии" - согласен.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33582024
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Марк softwarerИ запись неоднозначна далеко не при всех значениях, скорее при "очень некоторых".
Я имел ввиду конкретный пример, который привел выше.
Выберете уж что-нибудь одно. Если неоднозначно в конкретном примере - значит, конкретный пример a/0 точно так же дискредитирует запись вида a/b. Если для a/b действует аргумент "неопределен только в некоторых случаях" - значит, и для (+) некоторые случаи не являются основанием для глобальный выводов.

Локшин МаркМаловата будет (c). Часто требуется больше.
И насколько часто? Конечно, зависит от схемы данных, но.... верну Вам пассаж про то, что когда подзапросы необходимы - они необходимы и надо их писать.

Кстати, подкину еще одну задачку к размышлению. Если именно неоднозначность так пугает и является основным показанием к введению нового синтаксиса, возникает вопрос: а почему, собственно, не сделали совершенно тривиального действия и не разрешили эту неоднозначность точно так же, как она разрешается в join-ах?

Локшин МаркПишу запросы не выходя из коматозного состояния что-ли? Меня вот Ваш ответ смущает.
Хм. Когда Вы пишете запросы, много ли Вы думаете о том, каким пальцем на какую кнопку нажать? О том, правильно ли Вы написали слово SELECT или с ошибкой? Если да - а остается ли у Вас время подумать о деле?

Я абсолютно уверен, что у любого достаточно опытного человека технические действия выполняются на автомате, без явного мыслительного процесса. Например, я уверен, что Вы выбираете нужный вариант - LEFT или RIGHT JOIN - на автомате, в то время как меня неизменно удивляет, какие шутники назвали операцию "присоединение справа" LEFT JOIN-ом.

Локшин МаркНу про сервер никто не говорит.
Так уж и никто? :)

Вы говорите о вопросе, который значим не более, нежели проверка правильности написания слова SELECT. Но если второе Вы почему-то доверяете пальцам и серверу, то первое позиционируете как основание для кардинальной переделки существующего.

Локшин МаркЭ... погодите. IMHO у Вас все же проскакивает мысль, что я считаю, что "от подзапросов можно отказаться". Это не так, просто не нужно их (IMHO) необоснованно вводить.
Хм. Проскальзывает - неподходящее слово. Видимо, стоит объяснить схему рассуждений более явно.

Мы рассуждаем о различиях между некими двумя подходами. Различия - бывают качественные и количественные. Например, то, что маркетологи посоветовали не реализовывать full outer join через (+) - это качественное различие; разумеется, если потребуется, я покажу, как достаточно хорошо расписать его через (+), но объективно такая возможность не предусмотрена; это качественное отличие.

В том, на что Вы отвечаете, я показал, что качественного отличия между вариантами нет. Если бы "подзапросы против отсутствия подзапросов" - это было бы качественное различие; если же "обоснованные подзапросы здесь против обоснованных подзапросов там" - различие количественное, и максимум можно попробовать оценить, сколько их там и здесь.

Разумеется, Вы имеете право назвать "подзапросы здесь" необоснованными. Это сугубо религиозный аргумент. Что значит религиозный: основанием для него является вера в то, что "делать нужно так", и все что не соответствует этому объявляется необоснованным.

Локшин Марк softwarerУгу. И эти вещи будут - как понять запрос, в котором относящиеся к одному и тому же условия разнесены на полторы страницы.
Да и у Вас также получится с подзапросом,
Хм. Для экономии времени не собираюсь возражать на "получится с подзапросом". Вместо этого укажу, что у меня это получится только с подзапросом (то есть в тех отдельных случаях, когда нужен "неоднозначный outer join"), в то время как у Вас это будет получаться в каждом большом запросе, даже вообще без единого outer join-а.

Локшин Маркпричем часть условий соединения во FROM, часть в WHERE перемешанные с условиями фильтрации будут.
А вот этот аргумент меня очень огорчает. Потому что на предыдущей странице я обосновал (во всяком случае, возражений не последовало), что имено в WHERE существует свобода записи, позволяющая расписать условия именно исходя из максимальной логичности, понятности записи. Вы сейчас просто игнорируете ранее достигнутое и утверждаете прямо противоположное так, словно это аксиома.

Локшин МаркИ отношение вы переименовываете, т.е. по человеку изучая запрос нужно помнить что Вы и как переобозначили по отношению к стандартной схеме БД.
Хм. Во-первых, переименовывать совершенно не обязательно - с моей точки зрения это помогает ясности, но если Вам так больше нравится, никто не мешает использовать тривиальное переименование, сам в себя. Во-вторых, я не очень понимаю, чего именно Вы избегаете; можно предположить, что Вы имеете в виду использование в запросах для квалификации имен таблиц, то есть пишете что-то типа

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select
  Schema.Organizations.Organization_Id,
  Schema.Organizations.Organization_Name,
  Schema.Organizations.Address
from
  Schema.Organizations
where
  Schema.Organizations.Date_Created >= Trunc ( Sysdate ) 

Я избегаю как раз такого вот заикания. Причин для этого две - во-вторых, этот подход становится неприменимым при нескольких подключениях в запрос одной и той же таблицы, а во-первых я полагаю более практичным использовать значимые с точки зрения роли в конкретном запросе алиасы и сокращать ими запись, фокусируя внимание на собственно сути запроса.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33582066
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Вы, безусловно, можете считать это незначительным вопросом. Я же считаю это непониманием технологии разработки качественного программного обеспечения. Запрос, использующий natural join в любом его виде, может быть затронут (стать неверным) из-за мелкого изменения в БД либо в удаленной по тексту части этого запроса. Его использование в боевом коде - примерно то же, что передача параметров подпрограммы через разделяемые глобальные переменные.
Даже если в запросе участву.т проекции? Т.е. строгий перечень полей изменеие, которых в любом случае сделает и другие запросы "неверными" (скорей всего при таких изменниях БД и запросы нужны другие)? Трудно представить себе качественное программное обеспечение с использованием (+). Это все-таки рудименты прошого, отвегнутые в стандартах. А без стандартов о каком качестве можно говорить?
(+) тогда тоже можно сравнить с заплатками в коде - использовались за не имением лучшего. Даже производители не рекомендуют. Какое там еще качество боевого кода?
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33582078
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoДаже если в запросе участву.т проекции? Т.е. строгий перечень полей
Даже. Потому что альтернатива - добавляя необходимое поле в подзапрос, не забыть отмотать текст на пару страниц вниз и посмотреть, не участвует ли этот запрос в natural join, после чего отмотать на страницу вверх и посмотреть, нет ли случайно одноименного поля в другом подзапросе. И это необходимо делать каждый раз из-за того, что его автор поленился один раз набрать несколько дополнительных символов. Ну а тем временем другой программист, решив, что во втором подзапросе использован не очень удачный алиас, переименовывает его и таки ломает natural join.

vadiminfoизменеие, которых в любом случае сделает и другие запросы "неверными" (скорей всего при таких изменниях БД и запросы нужны другие)
Да бросьте. Добавление нового поля в таблицу или в запрос - если и не самая частая операция мелкой доработки, то точно одна из таковых.

vadiminfoТрудно представить себе качественное программное обеспечение с использованием (+). Это все-таки рудименты прошого, отвегнутые в стандартах.
Стандарт на перебегание улицы перед идущим автотранспортом вовсе не убедит меня рисковать своей жизнью. Вас убедит?

vadiminfoА без стандартов о каком качестве можно говорить?
Простите, демагогия.

vadiminfo(+) тогда тоже можно сравнить с заплатками в коде - использовались за не имением лучшего. Даже производители не рекомендуют. Какое там еще качество боевого кода?
Сравните, не возражаю. Собственно классический вопрос - Вам шашечки или ехать? Мне - ехать, то есть хорошо работающую, качественную программу. Вам....

Чтобы обосновать Ваше утверждение, Вам придется доказать, что использование нестандартизованной фичи есть нарушение стандарта ANSI SQL, нарушение стандарта ANSI SQL эквивалентно работе "без стандартов вообще", а работа "без стандартов вообще" неизбежно ведет к некачественному коду. Сумеете? Как минимум второй пункт вызывает у меня большие сомнения.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33582178
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Даже. Потому что альтернатива - добавляя необходимое поле в подзапрос, не забыть отмотать текст на пару страниц вниз и посмотреть, не участвует ли этот запрос в natural join, после чего отмотать на страницу вверх и посмотреть, нет ли случайно одноименного поля в другом подзапросе. И это необходимо делать каждый раз из-за того, что его автор поленился один раз набрать несколько дополнительных символов. Ну а тем временем другой программист, решив, что во втором подзапросе использован не очень удачный алиас, переименовывает его и таки ломает natural join.

Какой-то сложный процесс программирования. Непонятно када и что они там делают с этим запросом. Была речь про изменения, которые повлияют на NATURAL JOIN, но не повлияли бы на запятые. Вот присмеры проясните траблу, про которую говорите

Код: plaintext
1.
2.
3.
4.
select * from 
(select id, a from aj) 
 natural join
(select id, b from bj) 


Код: plaintext
1.
2.
select aj.*, bj.b from aj, bj
  where aj.id = bj.id
Но то, что первый семантичнее на первый взляд ведь видно?
Естественное соединение - классика. А второй что? - Декартово соединение с выборкой из него? Да и то что это соединение даже декартово не написано явно. Просто список таблов. Ну не знаю даже - как-то из Обнинска через Калугу в Москву.
Теперь грите про подвохи. Мож я не заметил?

softwarer
Да бросьте. Добавление нового поля в таблицу или в запрос - если и не самая частая операция мелкой доработки, то точно одна из таковых.


Я имел в виду, что это добавление влияет или нет одинаково на оба синтаксиса. Вот пример написан в предыдущем абзаце. Добавьте поля в таблы. Какая разница? А если ID переименуете, то оба запроса плетят.
Кстати? а если без под запроса и id в двух переименуете или добавите в обе одинаковые поля по которым действительно должны быть соединение вместо старого, так NATURAL JOIN менять не придется, а с запятыми придется. Так что формально можно найти случаи када он устойчивей к измениям.

softwarer
Стандарт на перебегание улицы перед идущим автотранспортом вовсе не убедит меня рисковать своей жизнью. Вас убедит?

Речь была о качестве. Для него стандарты имеют значение. На западе стандарты демократичны и отражают по мере сил точки зрения всех заинтересованных сторон и производителей и потребителей.

softwarer
Простите, демагогия.

Не думаю. Качество предполагает соответсвие стандартам. Это должно давать много пользы. Например, такой запрос быстрей поймут проггеры разных СУБД.
Это относится к качеству.

softwarer
Сравните, не возражаю. Собственно классический вопрос - Вам шашечки или ехать? Мне - ехать, то есть хорошо работающую, качественную программу. Вам....

Мне то же. плюс стиль упрощающий сопровождение и разработку.

softwarer
Чтобы обосновать Ваше утверждение, Вам придется доказать, что использование нестандартизованной фичи есть нарушение стандарта ANSI SQL, нарушение стандарта ANSI SQL эквивалентно работе "без стандартов вообще", а работа "без стандартов вообще" неизбежно ведет к некачественному коду. Сумеете? Как минимум второй пункт вызывает у меня большие сомнения.

JOIN введен начиная с SQL2 и выше. Тока первом внешних соединений не было, а для внутренних запятая.
У качественного кода, наверное, несколько критериев. Один из них соответствие стандартам. Это позволяет легче воспринимать разным проггерам. Это влияет на сопровождение и разработку. В том числе даже допускает перенос на другую РСУБД. Тем более, что многие, например, фокспрошники работают сразу с несколькими СУБД. Чеж тут еще обосновывать то?
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33582259
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerЕсли неоднозначно в конкретном примере - значит, конкретный пример a/0 точно так же дискредитирует запись вида a/b.
Еще раз повторяю - выражение a/b однозначто определяет результат операции, в отличае от *=.
softwarerЕсли именно неоднозначность так пугает и является основным показанием к введению нового синтаксиса, возникает вопрос: а почему, собственно, не сделали совершенно тривиального действия и не разрешили эту неоднозначность точно так же, как она разрешается в join-ах?
Не совсем понял, о чём Вы говорите...
softwarerЯ абсолютно уверен, что у любого достаточно опытного человека технические действия выполняются на автомате, без явного мыслительного процесса.
Дык нет же. Ладно когда с нуля пишешь, а когда исправляешь запрос, да еще не тобой написанный и нужно вставить *=. Нужно найти и проверить все условия в WHERE, чтобы убедиться, что уже не используется полусоединение.
softwarer, в то время как меня неизменно удивляет, какие шутники назвали операцию "присоединение справа" LEFT JOIN-ом.
Очень просто - это операция при соединении оставляет "висящие" кортежи слева.
softwarerто первое позиционируете как основание для кардинальной переделки существующего.
Это где такое я говорил?
softwarerПотому что на предыдущей странице я обосновал (во всяком случае, возражений не последовало), что имено в WHERE существует свобода записи, позволяющая расписать условия именно исходя из максимальной логичности, понятности записи.
А потому и не последовало, что это уже типичный вопрос религии. Вы сперва формализуйте понятия "максимальной логичности", "понятности" а потом я возражать буду. Мне вот логичнее и понятнее это во FROM писать.
softwarer во-первых я полагаю более практичным использовать значимые с точки зрения роли в конкретном запросе алиасы и сокращать ими запись, фокусируя внимание на собственно сути запроса.
Это когда вы пишите, может и быстрее сократить, а через год будете вспоминать, чего там насокращали и скакать туда-сюда по подзапросу в поисках операции переименования.
softwarerво-вторых, этот подход становится неприменимым при нескольких подключениях в запрос одной и той же таблицы
В этом случае неприменим (я же оговорился про это), но можно, например, приписывать суффикс к отношению. А то понапишут всяких огрызков типа st.a = or.b и потом сиди разбирай какое отношение с каким связывается.
vadiminfoКстати? а если без под запроса и id в двух переименуете или добавите в обе одинаковые поля по которым действительно должны быть соединение вместо старого, так NATURAL JOIN менять не придется, а с запятыми придется. Так что формально можно найти случаи када он устойчивей к измениям.
А вот здесь я с softwarer согласен. По мне, так уж лучше я явно должен буду добавлять условие соединения в запросе, чем сервер мне надобавляет их автоматом там, где не нужно всего лишь из-за того, что совпали названия атрибутов.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33582264
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Марк
А вот здесь я с softwarer согласен. По мне, так уж лучше я явно должен буду добавлять условие соединения в запросе, чем сервер мне надобавляет их автоматом там, где не нужно всего лишь из-за того, что совпали названия атрибутов.

Вы, наверное, не совсем поняли смысл фразы. Там было сказано слово "формально". Формально нельзя сказать, что даже в том опасном применении NATURAL JOIN всегда менее устойчив к изменениям. И на самом деле сервер автоматом не надобавляет, а просто выполнит то что написано -а надобавляли руками парни в БД. Причем второе одинаковое поле, но не имея в виду соединение. Не уверен, что это хорошие парни. Но у нас так делают иногда некоторые - добавляли када апгрэйдили, что-то там заливали наспех. А потом забыли удалить, хотя оно не нужно.
Ничего о том, что так использовать NATURAL JOIN лучшее из лучшего сказано не было.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33582366
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NATURAL JOIN как мне кажется не сильно хорош тем, что тупо связывает по одинаковым именам полей. В этом плане KEY JOIN гораздо приятнее, так как для связи таблиц оптимизатор использует поля, указанные в FK, типа того:
Код: plaintext
1.
2.
3.
4.
SELECT *
FROM Table1 t1
  KEY JOIN Table2 t2
  KEY LEFT JOIN Table3 t3 ON t3.Field >  0 
что эквивалентно при связи t1<-t2<-t3:
Код: plaintext
1.
2.
3.
4.
SELECT *
FROM Table1 t1
  JOIN Table2 t2 ON t2.t1_id = t1.id
  LEFT JOIN Table3 t3 ON t3.t2_id = t2.id AND t3.Field >  0 
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33582408
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoКакой-то сложный процесс программирования.
Именно что.

vadiminfoНепонятно када и что они там делают с этим запросом. Была речь про изменения, которые повлияют на NATURAL JOIN, но не повлияли бы на запятые. Вот присмеры проясните траблу, про которую говорите
Ставлю задачу: брать из таблицы aj еще и поле b (использовать в расчетах, вывести в интерфейсе или что-нибудь в том же духе).

vadiminfoНо то, что первый семантичнее на первый взляд ведь видно?
Я не понимаю, что Вы называете "семантичнее", но в целом ничего особенно привлекательного в первом запросе я не вижу.

vadiminfoЕстественное соединение - классика.
Угу. Примерно такая же классика, как на дельфе - лезть к серверу компонентом TTable, выбирая нужную запись свойством Filter.

vadiminfoНу не знаю даже - как-то из Обнинска через Калугу в Москву.
Это относится скорее к "явно прописываемому join-ами порядку". В where-синтаксисе запрос будет "дайте мне пожалуйста оптимальный маршрут, проходящий через Калугу, Москву и Обнинск".

vadiminfoТеперь грите про подвохи. Мож я не заметил?
Если не хотите замечать, безусловно не заметите.

vadiminfoЯ имел в виду, что это добавление влияет или нет одинаково на оба синтаксиса. Вот пример написан в предыдущем абзаце.
Выше я показал пример "неодинакового влияния". Поскольку пример тривиален, мне трудно поверить, что Вы его не видели.

vadiminfoКстати? а если без под запроса и id в двух переименуете или добавите в обе одинаковые поля по которым действительно должны быть соединение вместо старого, так NATURAL JOIN менять не придется, а с запятыми придется. Так что формально можно найти случаи када он устойчивей к измениям.
Это еще более замечательный случай, поскольку в нем WHERE-запрос отвалится с "invalid field name" в то время как NATURAL JOIN плавно и незаметно станет работать как CROSS JOIN, и более толковым коллегам этого замечательного программиста придется провести несколько веселых выходных за починкой данных.

vadiminfoРечь была о качестве. Для него стандарты имеют значение.
Вы размахиваете словом "стандарты" без учета, что это за стандарты. Да и словом "качество" тоже. К примеру, можно программировать на строгом ANSI SQL и тем сделать программу понятнее для "любого БД-программиста". Но качественной такую программу сочтут... далеко не все. Хотя есть люди, которые сочтут.

vadiminfoНа западе стандарты демократичны и отражают по мере сил точки зрения всех заинтересованных сторон и производителей и потребителей.
И? От того, что моя программа наполовину нагнута под интересы производителя СУБД, причем на 40% - производителя не моей СУБД, она станет качественнее? Сомневаюсь....

vadiminfoНе думаю. Качество предполагает соответсвие стандартам. Это должно давать много пользы.
Хм. Тут уместна поговорка про обучение религиозным обрядам.

vadiminfoМне то же. плюс стиль упрощающий сопровождение и разработку.
В данном случае стиль может быть и упрощает разработку, но за счет усложнения сопровождения. Во всяком случае, ни я, ни (похоже) кто-либо еще из участников беседы не воспылал желанием перейти на такой стиль.

vadiminfoЧеж тут еще обосновывать то?
Хм. Обычно это звучит, когда обосновать не удается :)

Что ж. Итак, Вы четко заняли позицию "СУБД-независимого кода" как главного критерия качества. Предлагаю здесь это не обсуждать а вновь поднять один из вечных топиков типа "давайте программировать не зная конкретную СУБД".
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33582445
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Именно что.

Вопрос методик, процедур разработки.

softwarer
Ставлю задачу: брать из таблицы aj еще и поле b (использовать в расчетах, вывести в интерфейсе или что-нибудь в том же духе).

И в чем преимущество запятых? Его менять не придется? Это b должно участвавоть в соединениях ? Нет? Тогда в обоих оно не появится, а чтобы вывести в этох запросах придется в обоих дописать - в первом а подзапросе b с алиасом например b1, втором aj.b. Или нет?

softwarer
Я не понимаю, что Вы называете "семантичнее", но в целом ничего особенно привлекательного в первом запросе я не вижу.

Большую осмысленность - соединения явно прописано, а не расшифровывается из запятых. Он просто перечисление в плане привычого своего назначения.


softwarer
Вы не поняли. Наверное не хотите.

Если бы в первом примере вы добавили b с целю соединения, то естественное соединение "в еще более замечательном случе" не пришлось бы менять а запрос с запятыми начал работать не правильно. Это отрицание всеобщности во фразе о преимуществах запятых.


softwarer
Выше я показал пример "неодинакового влияния". Поскольку пример тривиален, мне трудно поверить, что Вы его не видели.

К сожалению не видел. Но в моем примере есть или нет это влияние?

softwarer
Вы размахиваете словом "стандарты" без учета, что это за стандарты.

Отмеячаю эмоциональность слова "размахиваете". Учет - очевиден - по умолчанию стандарты SQL - мы же на каком форуме?

softwarer
Да и словом "качество" тоже.

Разве не Вы первый этим словом не паросто размихавали, а хотели выбить естественное соединение раз и на всегда. Я всего лишь пошел по Вашему пути.


softwarer
К примеру, можно программировать на строгом ANSI SQL и тем сделать программу понятнее для "любого БД-программиста". Но качественной такую программу сочтут... далеко не все. Хотя есть люди, которые сочтут.


Тем более тада не понятен Ваш ответ mir про невозможнось качественного программирования с естественным соединением. Кто как сочтет.

softwarer
И? От того, что моя программа наполовину нагнута под интересы производителя СУБД, причем на 40% - производителя не моей СУБД, она станет качественнее? Сомневаюсь....

Начет нагнута не в курсах. Я не про нагнутость писал.

softwarer
Хм. Тут уместна поговорка про обучение религиозным обрядам.

Не знаю. Может и уместна. Вы не видите в стандартах ничего, что способствует улучшению качества?


softwarer
В данном случае стиль может быть и упрощает разработку, но за счет усложнения сопровождения.

Уверен в робратном. Мож разработку он и не упрощает - налабал как попало вот и быстрей разроаботал. А вот читать про (+) потом и другим людямвовремя сопровождиния - це да. Еще то удовольствие.

softwarer
Во всяком случае, ни я, ни (похоже) кто-либо еще из участников беседы не воспылал желанием перейти на такой стиль.

Я давно воспылал. Но не перейти, а использовать, если он лучше в данном случае чем другие. Любые JOIN, но тока не запяты и тем более (+).

softwarer
Хм. Обычно это звучит, когда обосновать не удается :)


Или када очевидно.

softwarer
Что ж. Итак, Вы четко заняли позицию "СУБД-независимого кода" как главного критерия качества.

Где я писал про главный критекрий? Где писал про "СУБД-независимого кода"?
Вы любите крайности - либо либо другое, но никада по середине? А ведь есть еще оптимальность.

softwarer
Предлагаю здесь это не обсуждать а вновь поднять один из вечных топиков типа "давайте программировать не зная конкретную СУБД".

Если Вы про меня, то я могу сказать - программируйте тока на Оракле. Но чем больше стандартов при прочих равных равных условиях, тем лучше.
Вы все-таки сторнник крайностей - раз не удается полностью все делать в соотвествии со, то откажемся от них ваще?
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33582446
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркЕще раз повторяю - выражение a/b однозначто определяет результат операции,
Чему равен результат операции 5/0?

Локшин Маркв отличае от *=
То есть результат select * from a, b where a.id *= b.id определен неоднозначно?

Локшин МаркНе совсем понял, о чём Вы говорите...
В случае join-синтаксиса есть определенные правила, согласно которым высчитывается требуемый порядок соединений, и по Вашим словам, он в отличие от, строго однозначен.

Вопрос: кто мешает использовать аналогичную логику в where-синтаксисе, если это кому-то было бы нужно?

Локшин Марк softwarerЯ абсолютно уверен, что у любого достаточно опытного человека технические действия выполняются на автомате, без явного мыслительного процесса.
Дык нет же. Ладно когда с нуля пишешь, а когда исправляешь запрос, да еще не тобой написанный и нужно вставить *=. Нужно найти и проверить все условия в WHERE, чтобы убедиться, что уже не используется полусоединение.
То есть Вы говорите о том, что исправляете запрос прежде чем поняли его? Типа "посмотрел на код, увидел, куда вроде как можно впендюрить изменение и впендюрил"? Имхо это опасная практика. Я еще понимаю, если не уделяется внимание тонкостям вычислений, подзапросам, смысл которых понятен без детального анализа итп - но править запрос, не понимая логики соединения таблиц, я бы не рискнул. Вот над этим как раз подумать не жалко.

Локшин Марк softwarer, в то время как меня неизменно удивляет, какие шутники назвали операцию "присоединение справа" LEFT JOIN-ом.
Очень просто - это операция при соединении оставляет "висящие" кортежи слева.
Хм. Да я в общем-то не к тому, что в этом есть что-то особенно плохое. Просто как иллюстрацию того, что и особо интуитивно понятное отсутствует. Грубо говоря, если взять некоего прога, не знающего про outer join, и показать ему тот и другой вариант, то:

В случае (+) ему нужно будет думать, связываемы ли таблицы требуемым образом без подзапроса, ну а в случае чего компилятор подстрахует.


В случае join ему потребуется вспоминать, называется ли нужное ему LEFT или RIGHT JOIN-ом, ну а в случае чего получится некорректный результат запроса.

Локшин Марк softwarerто первое позиционируете как основание для кардинальной переделки существующего.
Это где такое я говорил?
Хм. Полагаю, Вы согласитесь, что введение join-ов - это кардинальная переделка? И вроде как выдвинули именно этот аргумент в пользу их использования, то есть в обоснование их появления.

Локшин МаркА потому и не последовало, что это уже типичный вопрос религии. Вы сперва формализуйте понятия "максимальной логичности", "понятности" а потом я возражать буду.
У меня складывается ощущение, что Вы очень спешно читали то, о чем сейчас говорите. Ваше:

Код: plaintext
Мне вот логичнее и понятнее это во FROM писать.

- безусловно, вопрос религии, согласен. Но у меня Вы такого не найдете.

Я сказал, что свобода записи в WHERE позволяет сгруппировать и оформить условия "максимально логично" с персональной точки зрения того, кто пишет запрос. Требуя от меня формализации этой максимальной логичности, Вы профанируете эту свободу; Вы требуете от меня создания некоей "правильной для всех и всегда" точки зрения; как раз того, что сделали создатели join-ов и что мне решительно не нравится.

В этом смысле получается примерно так: я пришел к автоконструктору с мотоциклом, а он говорит: "сначала прикрути еще два колеса, а уж тогда я покажу тебе, чем эта конструкция неудачна".

Локшин МаркЭто когда вы пишите, может и быстрее сократить, а через год будете вспоминать,
Клянетесь?

Я бы все же посоветовал не давать столь опрометчивых обещаний относительно меня и используемой мной технологии. Также замечу, что если привыкнете давать толковые имена, а не "быстрее сократить" - скорее всего и у Вас такой проблемы не будет.

Локшин МаркВ этом случае неприменим (я же оговорился про это), но можно, например, приписывать суффикс к отношению.
Можно. Собственно, этот вопрос - отдельная большая тема, со своими плюсами-минусами в каждом из рассматриваемых случаев. Я собственно в основном хотел уточнить, что Вы имели в виду - этот вариант или еще что-нибудь.

А насчет "можно".. если обратите внимание, мы сейчас оказались в позиции, абсолютно симметричной относительно исходного обсуждаемого вопроса. По поводу join-ов: вы говорите, что метод позволяет в большем количестве случаев выдержать единый стиль и не писать лишнего подзапроса, я полагаю, что изредка писать этот "лишний подзапрос" - удачная плата за другие преимущества метода. По поводу именований: я говорю, что метод сокращений среди прочего позволяет выдержать более единый стиль, Вы же (видимо) считаете необходимость изредка добавлять "лишний суффикс" удачной платой за другие преимущества.

Локшин МаркА то понапишут всяких огрызков типа st.a = or.b и потом сиди разбирай какое отношение с каким связывается.
Хм. Мне захотелось - по материалам далеко не только этой дискуссии - вывесить универсальный баннер: "В любой технологии и в любом подходе можно сделать плохо. Примеры этого "плохо" нисколько не доказывают, что нельзя сделать хорошо и сами по себе не являются аргументами против этой технологии. Надо как минимум показать, что "делать хорошо" - трудно".
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33582458
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoВопрос методик, процедур разработки.
Это не вопрос методик. Это как раз необходимая методика работы при использовании этой технологии. Если она сложна и неадекватна задаче - это минус технологии.

vadiminfo softwarer
Ставлю задачу: брать из таблицы aj еще и поле b (использовать в расчетах, вывести в интерфейсе или что-нибудь в том же духе).

И в чем преимущество запятых? Его менять не придется? Это b должно участвавоть в соединениях ? Нет? Тогда в обоих оно не появится, а чтобы вывести в этох запросах придется в обоих дописать - в первом а подзапросе b с алиасом например b1, втором aj.b. Или нет?
Преимущество запятых в том, что не потребуется заглядывать на пару страниц вниз, дабы определить, используется ли поле "b" во втором подзапросе и соответственно нужно ли переименовывать его в "b1" в первом. Преимущество запятых в том, что если сделать в этой операции ошибку, запрос может быть станет выдавать ошибку (что терпимо), но не станет молча выдавать некорректных данных (что недопустимо).

vadiminfoБольшую осмысленность - соединения явно прописано,
Хм. То есть встретив natural join, мне нужно отмотать на страницу вверх и посмотреть на тридцать полей в верхнем подзапросе, специально запомнив те из них, которые имеют алиасы, предотвращающие излишнее соединение (например, поля PRICE, QUANTITY, DATE_ACTIVE и так далее). Затем отмотать на страницу вниз и повторить операцию. Далее сопоставить два списка и вычислить из них результат.

Простите, но я таки не вижу в этом осмысленности. Предлагаю считать вопросом религии.

vadiminfoЕсли бы в первом примере вы добавили b с целю соединения,
То мне в любом случае пришлось бы тщательно проверить новый запрос - выдает ли он нужные данные - и заново его оптимизировать. Необходимость написать несколько лишних букв и явно указать желаемое, так, чтобы сопровождающим не пришлось мучительно вычислять, что я имел в виду, на этом фоне выглядит "о очень малым".

vadiminfoто естественное соединение "в еще более замечательном случе" не пришлось бы менять а запрос с запятыми начал работать не правильно. Это отрицание всеобщности во фразе о преимуществах запятых.
Запрос с запятыми не начал бы работать неправильно. Полагаю, Вам пришлось бы очень долго искать нормального программиста, способного добавить поле с целью соединения, не указав соединения.

Также я бы просил Вас явно процитировать, на какую такую "всеобщую фразу о преимуществе запятых" Вы столь упорно отвечаете. Я за собой глобальных фраз не помню; помню лишь слова, что NATURAL JOIN позволяет незаметно внести очень тяжелую ошибку.

vadiminfoК сожалению не видел. Но в моем примере есть или нет это влияние?
Боюсь, я опять таки не понял, что Вы имеете в виду. Если обсуждаемый пример, данный Вами в прошлом письме, то я показал это влияние. Если пример с добавлением б для соединения, то наверное есть, но это скорее неважно - для опровержения Вашего тезиса об отсутствии влияния достаточно и одного примера.

vadiminfoОтмеячаю эмоциональность слова "размахиваете".
Есть такое. Я употребил именно это слово, поскольку по-моему именно оно отражает Ваш подход (во всяком случае, соответствует моему восприятию Вашего подхода).

vadiminfoУчет - очевиден - по умолчанию стандарты SQL - мы же на каком форуме?
Насколько я помню текст стандарта ANSI SQL, там нигде не говорится, что это стандарт качества программного обеспечения. Именно это и есть "без учета" - без учета предназначения стандарта, к которому апеллируете.

vadiminfoРазве не Вы первый этим словом не паросто размихавали, а хотели выбить естественное соединение раз и на всегда.
Я не хочу его выбить в том плане, что мне достаточно все равно, как Вы программируете.

Я сказал, что встретив natural join в боевом коде, испытал бы желание уволить его автора. Нарочито подчеркнув экстремальность такой ситуации. Реально, встретив такое, я бы посмотрел, что это за автор и в какой ситуации он бы его применил. Если это, назовем так, неопытный программист - объяснил бы ему, почему так делать нельзя. При необходимости - приказал бы. Хотя постарался бы не брать в команду тупого и при этом упрямого человека, соответственно вероятность приказа мала. Если программист опытный либо может и хочет обосновать этот подход - устроил бы обсуждение в рамках команды, по итогам которого дополнил бы стандарт разработки одним из следующих вариантов:

- не использовать
- использовать в некоторых исключительных случаях
- использовать по желанию разработчика
- везде делать именно так.

vadiminfoЯ всего лишь пошел по Вашему пути.
Не вижу аналогии, но верю, что Вы ее видите. Надеюсь, Вы не возражаете против моего права так или иначе воспринимать Ваш подход.

vadiminfoТем более тада не понятен Ваш ответ mir про невозможнось качественного программирования с естественным соединением. Кто как сочтет.
Хм. Я нисколько не возражаю против права "кого-то" считать что бы то ни было, в том числе нечто с моей точки зрения глупое. mir в своем письме сказал, что я возражаю против natural join из религиозных соображений. Я объяснил ему, что возражаю из соображений качества, которые с моей точки зрения к религиозным не относятся. Не относятся - потому что трудноформализуемы, но тем не менее косвенно измеримы.

Прошу прощения, сейчас мне пора уходить, так что на оставшуюся часть Вашего письма отвечу позже.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33582466
-------------
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Преимущество запятых в том, что не потребуется заглядывать на пару страниц вниз, дабы определить, используется ли поле "b" во втором подзапросе и соответственно нужно ли переименовывать его в "b1" в первом. Преимущество запятых в том, что если сделать в этой операции ошибку, запрос может быть станет выдавать ошибку (что терпимо), но не станет молча выдавать некорректных данных (что недопустимо).

vadiminfoБольшую осмысленность - соединения явно прописано,
Хм. То есть встретив natural join, мне нужно отмотать на страницу вверх и посмотреть на тридцать полей в верхнем подзапросе, специально запомнив те из них, которые имеют алиасы, предотвращающие излишнее соединение (например, поля PRICE, QUANTITY, DATE_ACTIVE и так далее). Затем отмотать на страницу вниз и повторить операцию. Далее сопоставить два списка и вычислить из них результат.

Простите, но я таки не вижу в этом осмысленности. Предлагаю считать вопросом религии.

vadiminfoЕсли бы в первом примере вы добавили b с целю соединения,
То мне в любом случае пришлось бы тщательно проверить новый запрос - выдает ли он нужные данные - и заново его оптимизировать. Необходимость написать несколько лишних букв и явно указать желаемое, так, чтобы сопровождающим не пришлось мучительно вычислять, что я имел в виду, на этом фоне выглядит "о очень малым".


2 softwarer
Гм, а можно несколько offtop - вопрос: поддается ли все это автоматизации?
Т.е. к примеру, для каждого SQL запроса хранить результаты анализа - откуда какие поля, как какие таблицы соединены при данном виде запроса и текущем состоянии схемы БД.
А при каждом изменении структуры таблиц - автоматически проводить повторный анализ этих запросов и сравнение, с генерацией предупреждений об изменении условий соединений и т.п.?
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33583942
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-------------поддается ли все это автоматизации? Т.е. к примеру, ......
В принципе можно. Теоретических препятствий вроде бы нет, но практических уйма - например, надо будет каким-то образом отлавливать изменение запроса в клиенте, причем понимать, что это именно изменение запроса, а не новый запрос, похожий на старый.

Главное - я не вижу практического смысла в такой автоматизации; по крайней мере овчинка явно не стоит выделки.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33584111
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoНачет нагнута не в курсах. Я не про нагнутость писал.
Хм. Допустим, у нас есть два варианта решить некую задачу: "стандартный" и "нестандартный", и мы их сравниваем. Какие возможны результаты такого сравнения:

1) "Стандартный" - лучше. В этом случае стандартность третьестепенна; главное, что мы выбираем лучшее решение.

2) "Нестандартный" - лучше. В этом случае говорить о плюсах стандарта - значит, агитировать за худшее решение (пусть и имеющее специфические плюсы). Это и есть то, что я назвал "нагибать программу".

3) Они примерно одинаковы, и "стандартность" является решающим плюсом в пользу первого варианта. Собственно единственное имхо, когда этот аргумент весом.

vadiminfoНе знаю. Может и уместна. Вы не видите в стандартах ничего, что способствует улучшению качества?
С точки зрения качества отдельно взятой программы - вижу, незначительное.Ровно так же вижу, что мольба на стандарты запросто может окончиться качественно разбитым лбом.

Отсюда вывод - надо делать качественную программу, и хорошо, если это удастся сочетать со следованием стандарту. Если не удастся - стандарт идет лесом.

vadiminfoЯ давно воспылал. Но не перейти, а использовать, если он лучше в данном случае чем другие. Любые JOIN, но тока не запяты и тем более (+).
Вадим, пожалуйста не примазывайтесь. Давайте четко разделим две вещи - NATURAL JOIN, о котором идет речь в этой ветке беседы, и все остальные JOIN-ы, которые обсуждались изначально.

Если мы продолжаем разговор о NATURAL JOIN - вроде бы никто из убежденных Вами в топике не отметился; напротив, двое сторонников ANSI JOIN-ов отозвались о Вашей методике без энтузиазма. Это, разумеется, никак не показывает, что методика плоха - но привлечь авторитет "ANSI JOIN-ов вообще" для ее обоснования не удастся.

Если же Вы хотите вернуться к обсуждению ANSI JOIN-ов - предлагаю начать с того места, где мы остановились. Если мне не изменяет память, это на первой странице.

vadiminfo softwarer
Хм. Обычно это звучит, когда обосновать не удается :)

Или када очевидно.
Я очень ценю и часто цитирую фразу, сказанную одним из моих соучеников:

Код: plaintext
Если попробовать доказать очевидный факт, зачастую он оказывается вовсе и не очевидным. А иногда - вовсе и не фактом.

Как минимум, не вижу оснований считать очевидным то, что "очевидно" только одному из участников беседы.

vadiminfo softwarer
Что ж. Итак, Вы четко заняли позицию "СУБД-независимого кода" как главного критерия качества.

Где я писал про главный критекрий?
Там, где упорно не указываете никаких других. Вы обосновываете некоторое утверждение (о существенной зависимости качества от стандартности). Вы указали единственный аргумент в пользу этого. Следовательно, его достаточно; его вес таков, что все прочие аргументы за и против не способны изменить оценку. Здесь удобна аналогия с контрольным пакетом; этот аргумент должен быть таким - решающим, либо аргументация неверна.

vadiminfoГде писал про "СУБД-независимого кода"?
Там, где говорили про фокспрошников и проггеров разных СУБД. Или я Вас неверно понял?

vadiminfoВы любите крайности - либо либо другое
Не совсем так. Я люблю выдвигать достаточно экстремальные утверждения, верные в своей области определения. Очень часто при этом мои собеседники теряют ту самую область определения и воспринимают сказанное как "глобально экстремальное утверждение". Также я люблю выделять ключевую точку и уделять ей максимальное внимание. Как раз это происходит сейчас и, похоже, вызывает Ваше непонимание. Я полагаю, что если Вы привели единственный аргумент, его значимость - 80-90% от всего, что можно сказать в пользу X. Вы же, видимо, считаете его важность как 5-10%, и удивляетесь, что это я так экстремально обсуждаю малозначащую вещь.

vadiminfoЕсли Вы про меня, то я могу сказать - программируйте тока на Оракле. Но чем больше стандартов при прочих равных равных условиях, тем лучше.
Глупость, простите.

Лично меня бы устроило наличие действительно хороших (с точки зрения решаемых задач) стандартов. Количество же не столь хороших - по барабану. Причем я почти уверен, что и Вам тоже. Во всяком случае я абсолютно уверен, что если по-быстрому сочиню для Вас два-три десятка бредовых стандартов, Ваше "лучше" нисколько не улучшится.

vadiminfoВы все-таки сторнник крайностей - раз не удается полностью все делать в соотвествии со, то откажемся от них ваще?
Я полагаю, что нельзя быть немножко беременной. Полное соблюдение стандарта - дает некоторые преимущества (пусть, с моей точки зрения в общем случае не перекрывающие недостатков, но дает). Неполное соблюдение стандартов означает: и преимуществ нет, и недостатки тупо соблюдаются. Вывод? Для меня вывод - делать хорошо. И если, совершенно случайно, это "хорошо" совпадет с неким стандартом - еще лучше.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33584815
mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer mir в своем письме сказал, что я возражаю против natural join из религиозных соображений. Я объяснил ему, что возражаю из соображений качества, которые с моей точки зрения к религиозным не относятся. Не относятся - потому что трудноформализуемы, но тем не менее косвенно измеримыНу-ну. Я не так сказал. Автоцитата: "Это что-то больше психологическое, чем технологическое." То есть технологический аспект данного вопроса я признаю, но считаю его малосущественным по сравнению с огромным количество других, гораздо более важных технологических проблем SQL-программирования, среди коих создание стандарта именования объектов БД, стандарта оформления (форматирования) скриптов и т.д. В этой связи вопрос "как писать JOIN" выглядит мелко для столь категоричных заявлений, как ваше. А поскольку достаточно веско обосновать свою точку зрения вы пока не сумели, то здесь для меня показалось очевидным сильное влияние психологического аспекта, а именно силы привычки, либо воспринятое на веру мнение авторитетного для вас человека. То есть ничего обидного я в виду не имел (а обвинение в религиозном фанатизме в технической сфере считаю обидным, и к вам не отношу).
Поскольку вы сами сказали, что обсуждаемые материи трудноформализуемы, подходящим критерием обычно является опыт. Опыта использования NATURAL JOIN у меня нет (ну не поддерживает его SQL Server), поэтому на это тему спорить не берусь, возможно вы правы. Но прав только в том случае, если у вас у самого есть реальный опыт многочисленных шишек от NATURAL JOIN, а не просто мнение по этому вопросу.
Однако по поводу использования синтаксиса INNER/OUTER JOIN во FROM опыта у меня предостаточно, и тут я могу с полным правом заявить, что никакого вреда в них окромя пользы за многие годы никогда не видел.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33585434
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Хм. Допустим, у нас есть два варианта решить некую задачу: "стандартный" и "нестандартный", и мы их сравниваем. Какие возможны результаты такого сравнения:

1) "Стандартный" - лучше. В этом случае стандартность третьестепенна; главное, что мы выбираем лучшее решение.

2) "Нестандартный" - лучше. В этом случае говорить о плюсах стандарта - значит, агитировать за худшее решение (пусть и имеющее специфические плюсы). Это и есть то, что я назвал "нагибать программу".

3) Они примерно одинаковы, и "стандартность" является решающим плюсом в пользу первого варианта. Собственно единственное имхо, когда этот аргумент весом.

Думаете? Вы считаете такие рассуждения примером обоснования (помятуя о том что мне Вы напоминаете про обоснования)?
В 1) случае: Почему Вы думаете что для всех стандартность третьестепенна?
В каком смысле? Ну хорошо то, что Вы выбрали лучшее решение. Повезло.
В плане качества однако у Вас тоже не малый плюс. Поди плохо?

Во 2) Причем здесь агитация? Констатация - есть в качестве вот такие то недостатки. Решенее то лучшее, но среди возможных. А качество имеет такие-то и такие некдостатки не смотря на это. Заказчку мож об этом и не стоит говорить, а для себя отметить то можно, а возможно и нужно.

3) ну тем более решающий плюс.
Однако, када не решающие плюсы тоже не третьесортны в общем случае.
Тем более вопросы о качестве и о выборе не совсем одно и то же.
Ну выбрали Вы Волгу, ну лучше она пятерки. Последний ли она писк по качеству? И имеет ли это или нет значение?
Тем более в нашем то случае то что (+) лучше ваще пока более чем сомнительно. Т.е. Ваш третий вариант как минимум. А то и первый.

softwarer
С точки зрения качества отдельно взятой программы - вижу, незначительное.Ровно так же вижу, что мольба на стандарты запросто может окончиться качественно разбитым лбом.

Про мольбу на стандарты разделяю Ваши опасения, но насчет незначительности стандартов тоже опасаюсь - это неоправданно беспечное к ним отношение.

softwarer
Отсюда вывод - надо делать качественную программу, и хорошо, если это удастся сочетать со следованием стандарту. Если не удастся - стандарт идет лесом.

Лесом может пойти отчасти и качество. Лучшее из возможного и качественное не всегда одно и тоже. Или Вы думаете всегда?

softwarer
Вадим, пожалуйста не примазывайтесь.

Хорошо. Особенно, если буду знать в каком смысле и куда или к чему.

softwarer
Давайте четко разделим две вещи - NATURAL JOIN, о котором идет речь в этой ветке беседы, и все остальные JOIN-ы, которые обсуждались изначально.

Это зачем же их разделять? NATURAL JOIN частный случай JOIN в плане синтаксиса. Я его привел как дополнительный аргумент в пользу JOIN. Тем более я высказывался что для стиля в боевом коде лучше либо одни JOIN либо одни запятые?
Что бы не было тут играть, а где рыбу заворачивали не играть. С этим то Вы согласны?
И я все еще думаю что JOIN лучше (первый Ваш вариант). И привожу все доводы. И мне это не для того, чтобы кого-то убедить, сагетировать или доказать свою правоту - я это защищаю, чтобы самому более уверенно применять. Но допускаю, что чего-то упустил.

softwarer
Если мы продолжаем разговор о NATURAL JOIN - вроде бы никто из убежденных Вами в топике не отметился; напротив, двое сторонников ANSI JOIN-ов отозвались о Вашей методике без энтузиазма. Это, разумеется, никак не показывает, что методика плоха - но привлечь авторитет "ANSI JOIN-ов вообще" для ее обоснования не удастся.


И хорошо, что убежденные мною не отметились - я не готов брать на себя груз отвественности. Пусть каждый решает для себя сам и уж точно не из-за того что я сагитировал. Полно литературы. Мы тут просто проверяем эти точки зрения на критикуемость.

softwarer
Я очень ценю и часто цитирую фразу, сказанную одним из моих соучеников:


Если попробовать доказать очевидный факт, зачастую он оказывается вовсе и не очевидным. А иногда - вовсе и не фактом.

Как минимум, не вижу оснований считать очевидным то, что "очевидно" только одному из участников беседы.

В мире полно хороших фраз и эта тоже. Но пока реально очевидность преодолевали Каперник, Галиллей, ну 10 или 100 мыслителей.
Кроме того, в том случае следовало для доказательства использовать какую-то формальную систему? Там были обычные доводы в духе этого топика. Не строгие. Но Вы стали говорить о том, када обчно говорят так то так-то. Ну я привел еще один обычный на мой взляд случай использования той фразы. Т.е. это все способы рассуждений в духе топика. Или все кроме меня доказывают теореемы в духе Вейершрасса? Тока я халявлю?

softwarer
Там, где упорно не указываете никаких других.

Про это говорили и потому не указывал других. Но не упорно. Что главенство зависит от не указывания других?

softwarer
Вы обосновываете некоторое утверждение (о существенной зависимости качества от стандартности). Вы указали единственный аргумент в пользу этого. Следовательно, его достаточно; его вес таков, что все прочие аргументы за и против не способны изменить оценку. Здесь удобна аналогия с контрольным пакетом; этот аргумент должен быть таким - решающим, либо аргументация неверна.

Главный, навеное, это када его достаточно для того, что было качество высшей пробы. А если его отсутсвие оставляет вопросы к качеству - это по-моему не главный, но заметный среди прочих. Могут быть и другие такие с такими же свойствами.
Вот кстати и Вы приводите аргументы основанные на удобных аналогиях. Этого достаточно для обоснования? Мне что-то кажется, что нет.


softwarer
Там, где говорили про фокспрошников и проггеров разных СУБД. Или я Вас неверно понял?


Конечно не верно. Это было бы верно, если бы я был рьяный сторнник крайностей. Есть относительная независимость от производителя СУБД, есть абсолютная. Чем больше независмости тем лучше. Но есть глубина управления данными, которая опирается на фичи СУБД. Абсолютная независмость ограничивает возможности использования возможностей СУБД.
Т.е. они в противоречии. Исчем оптимум. Однако, есть базовые весчи в РМД. К ним относятся базовые операции SQL. В частности, соединения. Они достачно часто и похожих случаях применяются во многих РСУБД.

softwarer
Не совсем так. Я люблю выдвигать достаточно экстремальные утверждения, верные в своей области определения. Очень часто при этом мои собеседники теряют ту самую область определения и воспринимают сказанное как "глобально экстремальное утверждение". Также я люблю выделять ключевую точку и уделять ей максимальное внимание. Как раз это происходит сейчас и, похоже, вызывает Ваше непонимание. Я полагаю, что если Вы привели единственный аргумент, его значимость - 80-90% от всего, что можно сказать в пользу X. Вы же, видимо, считаете его важность как 5-10%, и удивляетесь, что это я так экстремально обсуждаю малозначащую вещь.
Нет я удивляюсь, что Вы мне приписываете крайности. Не писать же мне длинные тексты каждый раз про золотую середину?
Про экстремальные утверждения не въехал - это точки перегиба или макимумы всякие? Если я привел единственный аргумент, то это не обязательно означает что других нет или этот главный. Возможно это первый по ситуации. Здесь и так тексты длинные плохо воспринимаются. Я в первом посте привел несколько, но не задавался целью определить все это или важнейшие. Мы же на форуме, а не докторские пишем.

softwarer
Глупость, простите.

Может и так. А я не тока говорю, я еще и думаю так.

softwarer
Лично меня бы устроило наличие действительно хороших (с точки зрения решаемых задач) стандартов. Количество же не столь хороших - по барабану. Причем я почти уверен, что и Вам тоже. Во всяком случае я абсолютно уверен, что если по-быстрому сочиню для Вас два-три десятка бредовых стандартов, Ваше "лучше" нисколько не улучшится.

Ну они стараются по мере сил, чтобы как можно больше заинтересованных это устроило. Про количество я и не гавару - подразумеваются стандарты SQL, начиная с SQL2. Опасаюсь говорить "очевидно" из-за Вашего соученика.
Если же Вы сочините и не по быстрому, и не тока для меня (стандарты имеют значения тока када им многие следуют) и не бредовых, а так чтобы им следовали конкурирующие между собой производители (еще одна задача не допустить чтобы стандарты присходили от одного производителя), то мое лучше може таки улучшиться. Причем, я почти уверен, что Вы тоже так думаете. А как иначе? Ить это все будет кроме всего прочего означать, что Вы придумали что-то стоящее. Знаете скока стандартов понаписано? И что производители вовсе не рвутся им следовать? По своей воле они бы не стали (+) отменять. Этот ж бабок стоит. Но уж если последовали, то стандарты прошли приличные оценки как минимум. А Оракл еще и не рекомендует (+).
А Вы говорите - сочиню для Вас бредовые. Спасибо за такую заботу.

softwarer
Я полагаю, что нельзя быть немножко беременной. Полное соблюдение стандарта - дает некоторые преимущества (пусть, с моей точки зрения в общем случае не перекрывающие недостатков, но дает). Неполное соблюдение стандартов означает: и преимуществ нет, и недостатки тупо соблюдаются.

Ну кто может и немножеко беременная - например. студентка на зачете.
Почему тока полное? А частичное? Чем больше тем лучше, но и немного тоже хорошо. Ить как минимум там где по стандартом понятнее. Тем более есть базовые вещи, например, базовые операции рел алгебры. Они составляют большую часть всех запросов и их понимание уже большой задел для понимания всего запроса, даже если там есть пока дополнительные специфические конретного СУБД фичи.
Вот почему совсем нет преимуществ? Если парни все будут легко понимать JOIN? А аналитческих фунций Оракла пока не будут понимать другие, разве это хуже, если они напроч ниче не понимают в текстах запросов друг друга?

softwarer
Вывод? Для меня вывод - делать хорошо. И если, совершенно случайно, это "хорошо" совпадет с неким стандартом - еще лучше.

Если бы я сделал подобный по стилю вывод, но с большим креном в пользу стандартов, Вы не вспомнили какого-нибудь своего соученика, чтобы раскритиковать меня в пух и прах?
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33585446
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerЧему равен результат операции 5/0?
Согласно математическому определению данной операции результат будет равен бесконечности.
Кстати, подумайте, что результаом применения операции может быть "неопределено". В отличае от *=, если такие аналогии проводить, то будет равно то-ли 5 то-ли 2, в зависимости от того как звезды на небе расположены.
softwarerТо есть результат select * from a, b where a.id *= b.id определен неоднозначно?
В этом частном случае однозначно, но в большом количестве других - нет.
softwarerВопрос: кто мешает использовать аналогичную логику в where-синтаксисе, если это кому-то было бы нужно?
И как Вы себе это представляете?
softwarerно править запрос, не понимая логики соединения таблиц, я бы не рискнул.
Т.е. чтобы прицепить к конкретному справочнику по left join, допустим подчиненную таблицу при типе связи "один к одному" Вы досканально изучаете весь запрос на 5 экранах вглядываясь во все условия фильтрации?
softwarer
В случае (+) ему нужно будет думать, связываемы ли таблицы требуемым образом без подзапроса, ну а в случае чего компилятор подстрахует.

В случае join ему потребуется вспоминать, называется ли нужное ему LEFT или RIGHT JOIN-ом, ну а в случае чего получится некорректный результат запроса.

А с какой стороны (+) написать ему уже думать будет не нужно?
softwarerИ вроде как выдвинули именно этот аргумент в пользу их использования, то есть в обоснование их появления.
Нет. Я говорил только про неоднозначность синтаксиса с *=.
softwarerЯ бы все же посоветовал не давать столь опрометчивых обещаний относительно меня и используемой мной технологии. Также замечу, что если привыкнете давать толковые имена, а не "быстрее сократить" - скорее всего и у Вас такой проблемы не будет.
А тогда вопрос напрашивается сам собой - а какого черта нужно было так в схеме называть отношения, чтобы потом их все время сокращать. Причем сокращать ВЕЗДЕ ОДИНАКОВО, иначе у Вас это извините не технология, а форменный бардак будет?
softwarerПо поводу именований: я говорю, что метод сокращений среди прочего позволяет выдержать более единый стиль,
Непонятно, зачем вводить еще одну систему - сокращений с полной ее реалищацией исключительно силами программиста. От чего здесь стиль будет более единый? У Вас также появятся аналоги суффиксов.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33586773
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Марк softwarerЧему равен результат операции 5/0?
Согласно математическому определению данной операции результат будет равен бесконечности.
А нельзя ли уж процитировать само определение и сказать, откуда Вы его взяли?

Кстати, правильно ли я понял, что Вы утверждаете, что 0 * oo = 5?

Локшин МаркКстати, подумайте, что результаом применения операции может быть "неопределено".
И зачем думать об этом, если это то, о чем я говорю?

Локшин МаркВ отличае от *=, если такие аналогии проводить, то будет равно то-ли 5 то-ли 2, в зависимости от того как звезды на небе расположены.
Аналогия неверна и отличия нет. В обоих случаях - попытаетесь ли Вы выполнить на сервере "неопределенное" деление либо "неопределенную" связку - сервер выдаст сообщение об ошибке, суть которого именно в неопределенном результате операции. Если бы он этого не сделал, это была бы ошибка реализации сервера.

Тем не менее, стоит так же отметить, что "то ли два, то ли пять" - это и есть неопределенность. В школьной математике Вы должны были проходить примерно следующее обоснование деления на ноль: чтобы вычислить результат деления на ноль, составим уравнение C/0 = x, где C - константа. Оно равносильно C = 0 * x, и по определению нуля оно выполняется для любого x (в старших классах, может быть, добавят "меньше бесконечности). И дальше объясняют, что раз любой x является решением исходного уравнения - и два, и пять, и минус пи - то результат неопределен, его нельзя однозначно вычислить.

Локшин МаркИ как Вы себе это представляете?
Так себе и представляю. Есть определенные правила расстановки приоритетов в join-ах. Применить те же правила для связок, написанных в where в том порядке, в котором они там написаны, ругаясь на непредставимые в терминах join-а комбинации.

Локшин Марк softwarerно править запрос, не понимая логики соединения таблиц, я бы не рискнул.
Т.е. чтобы прицепить к конкретному справочнику по left join, допустим подчиненную таблицу при типе связи "один к одному" Вы досканально изучаете весь запрос на 5 экранах вглядываясь во все условия фильтрации?
Обратите внимания, как грубо Вы передернули от моего "логика соединения таблиц" к "все условия фильтрации".

Простите, но по этой причине мне не хочется отвечать на этот вопрос.

Локшин МаркА с какой стороны (+) написать ему уже думать будет не нужно?
Теоретически, наверное, нужно. Практически - никогда не встречал человека, который бы провозгласил что-то типа "блин! опять не с той стороны написал".

Локшин Марк softwarerИ вроде как выдвинули именно этот аргумент в пользу их использования, то есть в обоснование их появления.
Нет. Я говорил только про неоднозначность синтаксиса с *=.
OK. Давайте окончательно поставим точку в этом вопросе. Выберите, пожалуйста, один из следующих вариантов:

1) "Неоднозначность синтаксиса с *=" является существенным аргументом в пользу ansi join-ов, достаточным, чтобы не приводить других аргументов.

2) "Неоднозначность синтаксиса с *=" является существенным аргументом в пользу ansi join-ов; другие аргументы есть (где?) и в сумме их достаточно.

3) "Неоднозначность синтаксиса с *=" упомянута для полноты коллекции и не является существенным аргументом (а где существенные и о чем идет спор - непонятно).

Локшин МаркА тогда вопрос напрашивается сам собой - а какого черта нужно было так в схеме называть отношения, чтобы потом их все время сокращать.
Я, кажется, предлагал вынести это в отдельный топик.

Для ответа удобно воспользоваться понятием namespace. Проектируя схему, необходимо управлять пространством в несколько тысяч имен, которые нужно достаточно четко разделять - поэтому появляются сущности, например, ITEM$GROUPS, ORG$GROUPS и так далее. Пространство имен в запросе куда уже - порядка десятков, поэтому детализированное разделение как правило необязательно и только замусоривает код.

Второй момент, который также влияет на этот процесс - роль таблицы в запросе. Допустим, если мне нужны контрагенты, я предпочту оперировать именно этим алиасом, даже если таблица называется, допустим, Организации. В этом же запросе та же таблица может всплыть под алиасом "банки" - а может и не всплыть, смотря по логике запроса.

Наконец, существует момент с подзапросами. Довольно часто с точки зрения восприятия запроса уместно выделение подзапроса (с его фильтрующими условиями) с подстановкой его на то место, где раньше была таблица. То есть

Код: plaintext
1.
2.
3.
4.
select 
  ....
from
  organizations org
...

заменить на

Код: plaintext
1.
2.
3.
4.
select
  ....
from
  ( select * from organizations where is_alive =  1  ) org
....

При использовании алиасов это довольно естественно; если же везде применять имена таблиц и обозвать подзапрос именем таблицы, это здорово дезориентирует; конечно, можно привыкнуть, но не думаю, что это хорошая практика.

Локшин МаркПричем сокращать ВЕЗДЕ ОДИНАКОВО, иначе у Вас это извините не технология, а форменный бардак будет?
Думаю, у нас разное понимание ВЕЗДЕ ОДИНАКОВО. Для меня это - используя одинаковую и достаточно прозрачную логику. Для Вас, подозреваю - нечто другое.

Локшин МаркНепонятно, зачем вводить еще одну систему - сокращений с полной ее реалищацией исключительно силами программиста. От чего здесь стиль будет более единый? У Вас также появятся аналоги суффиксов.
Хм. Вы пытаетесь посмотреть сквозь шоры своей системы. В ней, безусловно, придется делать именно суффиксы. Лично я запрос

Код: plaintext
1.
2.
3.
from 
  com$organizations client,
  com$persons head,
  com$persons manager

полагаю более "единостильным", нежели

Код: plaintext
1.
2.
3.
4.
from
  ....
  com$organizations,
  com$persons_head,
  com$persons_manager

и суффиксы вижу только во втором варианте.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33586920
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mirНу-ну.
Именно что.

mirЯ не так сказал. Автоцитата: "Это что-то больше психологическое, чем технологическое."
Не спорю. Согласны ли Вы с произведенной мной заменой психологического на религиозное (с учетом того смысла, который придан второму термину в дальнейшем обсуждении), или считаете это неправомерным?

mirТо есть технологический аспект данного вопроса я признаю,
Но считаете его несущественным (малосущественным), о чем дальше и говорите. Далее идет стандартный математический (и не только) прием - отбрасывание несущественных слагаемых. Далее я не говорю ничего, что делало бы такое отбрасывание некорректным - я говорю об общем смысле Вашего письма ("главным образом нетехнологическое") и противопоставляю ему общий смысл своего письма ("главным образом технологическое").

Если Вы не согласны с этим - прошу объяснить.

mirно считаю его малосущественным по сравнению с огромным количество других, гораздо более важных технологических проблем
Если не ошибаюсь, мы нигде в этом топике на момент Вашего письма не обсуждали другие проблемы, в том числе более важные, поэтому у Вас нет возможности отнормировать мое отношение к этой проблеме к отношению к каким-то другим. Соответственно, Вы не можете делать выводов из величины этого отношения.

mirВ этой связи вопрос "как писать JOIN" выглядит мелко для столь категоричных заявлений, как ваше.
Хм. То есть, если Вы видите, что программист-новичок делает мелкую в принципе ошибку, например отсутствие проверки на маловероятную некорректную ситуацию, Вы ни в какой ситуации не станете категорично настаивать на ее исправлении? То есть если он упрется рогом и скажет "не буду делать и все", Вы скажете "ладно, бог с тобой"?

Почему я задаю этот вопрос. Если Вы допускаете возможность категоричности в этом случае - разваливается Ваша логика связывания величины ошибки с категоричностью подхода "ошибки надо исправлять". Если же действительно в такой ситуации спустите на тормозах - это будет просто интересным для меня результатом.

В таком случае мне придется констатировать, что Вы согласны получить в итоге не столь качественный продукт [как тот, каким он легко мог бы стать]. Я придерживаюсь иной точки зрения, причем не скрываю, что в этом вопросе весьма категоричен.

mirА поскольку достаточно веско обосновать свою точку зрения вы пока не сумели,
Хм. Если не против, давайте остановимся на этом моменте.

К тому моменту, когда Вы написали свою фразу, я ее вообще не обосновывал. Я сказал саму фразу, vadiminfo на нее ответил, и как я собственно и предлагал - "полагаю, можно ставить точку" - на этом эта ветка и заглохла. Далее мы немного поговорили с Марком, и далее Вы написали в том числе и обсуждаемую сейчас фразу.

Поэтому, простите, я бы хотел придраться к Вашей передаче событий :)

mirто здесь для меня показалось очевидным сильное влияние психологического аспекта, а именно силы привычки, либо воспринятое на веру мнение авторитетного для вас человека. То есть ничего обидного я в виду не имел
Хм. Если обратите внимание, я нисколько не обиделся, но в ответном письме к Вам просто прояснил, какие соображения я считаю основными. Мало того, я считаю глупой саму мысль обидеться на "кто-то что-то обо мне подумал, и хуже того, высказал".

mir(а обвинение в религиозном фанатизме в технической сфере считаю обидным, и к вам не отношу).
Тут следует учесть, что в дальнейшем обсуждении это слово использовалось в переносном смысле, и в моей фразе было употреблено именно в нем же.

mirпоэтому на это тему спорить не берусь, возможно вы правы. Но прав только в том случае, если у вас у самого есть реальный опыт многочисленных шишек от NATURAL JOIN, а не просто мнение по этому вопросу.
Нет, по этому поводу у меня именно мнение. Основанное, разумеется, на шишках от каких-то других ситуаций, которые я полагаю сходными. Разумеется, прямых аналогий нет, но думаю Вы согласитесь - определенный опыт в "самом разном программировании" позволяет сформировать некие достаточно абстрактные критерии (на уровне универсальности "давать хорошие имена переменным, таблицам.....").
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #33588088
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerА нельзя ли уж процитировать само определение и сказать, откуда Вы его взяли?
А на память. Книжку находить - в библиотеку идти. Прогуглите фразу "деление на ноль бесконечность", получите интересные результаты
http://www.intuit.ru/department/pl/javapl/4/3.html
http://www.uni-vologda.ac.ru/java/jls/15-doc.htm (15.6.2)
http://www.codenet.ru/progr/optimize/pentopt/17.php (17.9)
Ну и т.д.
Справедливости ради нужно отметить, что деление на 0 на расширенном множестве действительных чисел определяют и как неопределенность для любого числа в числителе.
И то, что расширять можно либо парой +- бесконечность, либо просто бесконечностью без знака (второе расширение естественным образом обобщается на n-мерные пространства).
softwarerКстати, правильно ли я понял, что Вы утверждаете, что 0 * oo = 5?
Нет, не верно. Результат данной операции не определен. Бесконечность не является "настоящим числом". Это все равно, что говорить, что из oo/2=oo (с этим то Вы хотя бы согласны?) следует oo/oo=2.
softwarerИ зачем думать об этом, если это то, о чем я говорю?
Нет не о том, результат "неопределен" - это аналог значения null в РМД.
softwarerАналогия неверна и отличия нет. В обоих случаях - попытаетесь ли Вы выполнить на сервере "неопределенное" деление либо "неопределенную" связку - сервер выдаст сообщение об ошибке, суть которого именно в неопределенном результате операции. Если бы он этого не сделал, это была бы ошибка реализации сервера.
Я считаю, что аналогия верна, более того, можно сделать чтобы сервер при делении на 0 возвращал null а не ошибку (по крайней мере на некоторых).
softwarerТем не менее, стоит так же отметить, что "то ли два, то ли пять" - это и есть неопределенность.
Нет. В случае с *= получается, что так посчитаем - два, а так - пять, но не три, не четыре получиться не может. Это не совсем одно и тоже.
softwarerПрименить те же правила для связок, написанных в where в том порядке, в котором они там написаны
Ага, и сразу лишим оптимизатор использовать, например, свойство коммутативности операции and т.к. условия в WHERE трогать будет нельзя?
softwarerОбратите внимания, как грубо Вы передернули от моего "логика соединения таблиц" к "все условия фильтрации".
Не вижу ничего такого. У вас все условия в любом случае в одной куче, и мух от котлет Вам каждый раз отделять придется. При этом, поскольку все свалено в одном месте это будет сделать сложнее (IMHO).
softwarerOK. Давайте окончательно поставим точку в этом вопросе. Выберите, пожалуйста, один из следующих вариантов:
Объективно - первый, субъективно - второй, т.к. пойдут слабо формализуемые аргументы типа "так запрос семантичнее выглядит", поэтому я говорить об этом и не хочу.
softwarerДумаю, у нас разное понимание ВЕЗДЕ ОДИНАКОВО. Для меня это - используя одинаковую и достаточно прозрачную логику.
А для меня, чтобы когда я встретил в тексте head или manager я не думал, какое исходное отношение в БД было переименовано.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Разница между запятой и JOIN
    #37460343
Bogdanov Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркСправедливости ради нужно отметить, что деление на 0 на расширенном множестве действительных чисел определяют и как неопределенность для любого числа в числителе.Вы бы все-таки почитали более серьезную математическую литературу, прежде чем вот так просто начинать на ноль делить. Ну или хотя бы в википедию сходили.
В кратце можно сформулировать так - для того, чтобы избежать неопределенности с делением на ноль вы безумно усложнили всю аксиоматику. До этого аксиоматизирована было всего одина неопределенность. А в вашем же расширенном множестве (кстати а не потрудитесь ли полноценно сформулировать?) таких аксиоматизированных неопределенностей просто море.
В некоторых серьезных математических теориях действительно расширяют множество "бесконечными элементами", но эти конструкции уже достаточно сложны и используются отнюдь не для того, чтобы "можно было делить на ноль".
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #37460561
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы бы все-таки почитали более серьезную математическую литературуВы бы все-таки посмотрели на дату топика.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #37460924
Bogdanov Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LSVВы бы все-таки посмотрели на дату топика. На дату я действительно не посмотрел - из-за глюка форума сообщение было помечено у меня как новое. Соответственно к нему я ответ и написал. Ну а когда дату увидел - удалить сообщение было уже нельзя, а модераторы этого делать, видимо, не будут.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #37461061
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, учитывая, что модераторы таки удалили сообщение, которое подняло топик (и пометило его новым для Андрея) может и удалят. Или продолжим сраконструктивную дискуссию? :)
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #37653375
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bogdanov AndreyЛокшин МаркСправедливости ради нужно отметить, что деление на 0 на расширенном множестве действительных чисел определяют и как неопределенность для любого числа в числителе.Вы бы все-таки почитали более серьезную математическую литературу, прежде чем вот так просто начинать на ноль делить. Ну или хотя бы в википедию сходили.
В кратце можно сформулировать так - для того, чтобы избежать неопределенности с делением на ноль вы безумно усложнили всю аксиоматику. До этого аксиоматизирована было всего одина неопределенность. А в вашем же расширенном множестве (кстати а не потрудитесь ли полноценно сформулировать?) таких аксиоматизированных неопределенностей просто море.
В некоторых серьезных математических теориях действительно расширяют множество "бесконечными элементами", но эти конструкции уже достаточно сложны и используются отнюдь не для того, чтобы "можно было делить на ноль".
Да, давно дело было...
Вы не поверите, но я в своей жизни достаточно много читал серьезной математической литературы.
Вот вам еще ссылка . Наверное несерьезная фирма Wolfram? Кроме тех, которых я давал насчет определений деления в Яве и в сопроцессоре Intel. Ну и здесь наверное идиоты сидят? И множество это расширенное не мое, я на авторство не претендую.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #37654310
Bogdanov Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркДа, давно дело было...
Но вам таки нетерпится ответить...

Локшин МаркВы не поверите, но я в своей жизни достаточно много читал серьезной математической литературы.Действительно - не верю.

Локшин МаркИ множество это расширенное не мое, я на авторство не претендую.Ну так все-таки определение "расширенного множества" вы приведете? Мне авторство не важно.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #37654410
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bogdanov AndreyЛокшин МаркВы не поверите, но я в своей жизни достаточно много читал серьезной математической литературы.Действительно - не верю.
Локшин МаркИ множество это расширенное не мое, я на авторство не претендую.Ну так все-таки определение "расширенного множества" вы приведете? Мне авторство не важно.
Можете и не верить - я никого не заставляю. А ссылку на определение я уже приводил - смотрите например 2 ссылку в моем сообщении на которое отвечали изначально.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #37654486
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И кстати, если уж хочется подискутировать, то потрудитесь сперва ответить, почему во всех вышеназванных местах результат деления - бесконечность? И кто в Intel и Wolfram не читал серьезную математическую литературу? Значит можно и так и так определять? Или это неверно, потому, что в Демидовиче не так?
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #37654527
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bogdanov Andrey,
Кстати, Вы бы свою же ссылочку на википедию до конца прочитали бы сперва, прежде чем сомневаться в том чего я читал, а чего не читал...
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #37654783
Bogdanov Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркА ссылку на определение я уже приводил - смотрите например 2 ссылку в моем сообщении на которое отвечали изначально.Это вы мне спецификацию языка Java в качестве математиеского определения приводите? Спасибо, насмешили.
Вот как только вы мне сможете нормальную алгебраическую структуру описать в которой деление на нуль определено, тогда и продолжим беседу.

Локшин МаркКстати, Вы бы свою же ссылочку на википедию до конца прочитали бы сперва, прежде чем сомневаться в том чего я читал, а чего не читал...Я то как раз дочитал. И там четко сказано, что "деление на число 0 запрещено". А для особо непонятливых обясняют, что "a:0=бесконечность" означает ни что иное как запись предельного отношения, а никак не деления двух чисел. Но вы видимо этого не поняли.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #37654941
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bogdanov AndreyЛокшин МаркА ссылку на определение я уже приводил - смотрите например 2 ссылку в моем сообщении на которое отвечали изначально.Это вы мне спецификацию языка Java в качестве математиеского определения приводите? Спасибо, насмешили.
Вот как только вы мне сможете нормальную алгебраическую структуру описать в которой деление на нуль определено, тогда и продолжим беседу.
Далеко не только Java. Что такого данное описание операции деления делает с вещественными числами, что оно становится ненормальной алгебраической структурой? Когда это покажете, тогда и продолжим беседу.
Bogdanov AndreyЛокшин МаркКстати, Вы бы свою же ссылочку на википедию до конца прочитали бы сперва, прежде чем сомневаться в том чего я читал, а чего не читал...Я то как раз дочитал. И там четко сказано, что "деление на число 0 запрещено". А для особо непонятливых обясняют, что "a:0=бесконечность" означает ни что иное как запись предельного отношения, а никак не деления двух чисел. Но вы видимо этого не поняли.
ВикипедияОперации деления ненулевого числа на ноль не соответствует никакое действительное число.

Результат этой операции считается бесконечно большим и равным бесконечности:
Ну и чем эти слова противоречат тому, что я сказал?
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #37655304
Bogdanov Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркЧто такого данное описание операции деления детлает с вещественными числами, что оно становится ненормальной алгебраической структурой?Слив засчитан.
Вы сначала опишите хоть что-нибудь, а потом я вам расскажу что в вашем описании ненормально.
А пока кроме фразы "деление на ноль равно бесконечности" вы вообще ничего не описали. Что такое ваша бесконечность? Какими свойствами она обладает? Как в других операциях участвует? Пока вы не сделали своего гениального открытия никакой бесконечности в множестве действительных числел не было. Вы ее придумали, вот и потрудитесь ее свойства описать.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #37655334
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bogdanov AndreyЛокшин МаркЧто такого данное описание операции деления детлает с вещественными числами, что оно становится ненормальной алгебраической структурой?Слив засчитан.
Вы сначала опишите хоть что-нибудь, а потом я вам расскажу что в вашем описании ненормально.
А пока кроме фразы "деление на ноль равно бесконечности" вы вообще ничего не описали. Что такое ваша бесконечность? Какими свойствами она обладает? Как в других операциях участвует? Пока вы не сделали своего гениального открытия никакой бесконечности в множестве действительных числел не было. Вы ее придумали, вот и потрудитесь ее свойства описать.
Я не виноват, если написано одно, а человек читает абсолютно другое. В множестве действительных чисел никакой бесконечности нет, и я обратного нигде не писал. Но R^1 можно расширить либо 2-мя элементами +\infty и -\infty либо просто \infty. Соответственно определяются операции с данными элементами. Уже R^2 можно расширить только \infty. О чем я уже упоминал 6 лет назад. Вот ссылка на так любимую вами Википедию. Ну как видно из всего того, что Вы излагаете выше, этот материал Вам не знаком...
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #37655372
Bogdanov Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркЯ не виноват, если написано одно, а человек читает абсолютно другое. В множестве действительных чисел никакой бесконечности нет, и я обратного нигде не писал. Но R^1 можно расширить либо 2-мя элементами +\infty и -\infty либо просто \infty. Соответственно определяются операции с данными элементами. Уже R^2 можно расширить только \infty. О чем я уже упоминал 6 лет назад. Вот ссылка на так любимую вами Википедию. Ну как видно из всего того, что Вы излагаете выше, этот материал Вам не знаком...Так вы про множество действительных чисел говорите или про алгебраическую структуру (поле действительных чисел)? Или вы разницы между этими вещами не понимаете? Множество (и топологическое пространство) расширить бесконечностью можно, а вот с алгеброй там не очень. И заметьте в приведенной вами ссылке дано топологическое определение бесконечности, которе никакого отношения к делению не имеет.
А фраза "Соответственно определяются операции с данными элементами" в вашем сообщении просто ложь. Так как никакого определения операций вы предоставить не соизволили.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #37655435
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bogdanov AndreyТак вы про множество действительных чисел говорите или про алгебраическую структуру (поле действительных чисел)? Или вы разницы между этими вещами не понимаете? Множество (и топологическое пространство) расширить бесконечностью можно, а вот с алгеброй там не очень. И заметьте в приведенной вами ссылке дано топологическое определение бесконечности, которе никакого отношения к делению не имеет.

Что-то Вы очень много придумываете, а потом свои домыслы выдаете за мои высказывания. К томуже прочитайте раздел мотивировка в той же ссылке.
Bogdanov AndreyА фраза "Соответственно определяются операции с данными элементами" в вашем сообщении просто ложь. Так как никакого определения операций вы предоставить не соизволили.
Ложь? Читай 20 страницу. Я бы не сказал, что это самое удачное, но это в качестве примера. За другой литературой - ходи в библиотеку уж сам.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #37655628
Bogdanov Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркЛожь? Читай 20 страницу. Я бы не сказал, что это самое удачное, но это в качестве примера.Ну наконец-то. Хоть в чем-то топик оказался полезным - вы таки соизволили найти определения операций для работы с бесконечностью.
Теперь о том, что плохо.
Во первых, вместо одной неопределенности с делением на ноль пришлось узаконить кучу других (о чем я и писал с самого начала). То есть пятаясь доказать, что операция деления не приводит к неоднозначностям (а именно с этого все началось) вы ввели кучу других неоднозначностей (с делением при этом так и не разобрались).
Во-вторых, потеряны многие алгебраические свойства, которые были у поля рациональных чисел. Например, в поле для любого элемента есть обратный относительно сложения. Для ваших новых элементов обратных нет. Также наюблюдаются проблемы с дистрибутивностью. Например, в выражении (1-2)/0 скобки почему-то раскрыть нельзя. То есть нормальной алгебраической структурой ваше "расширенное множество" не является.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #37655729
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bogdanov AndreyЛокшин МаркЛожь? Читай 20 страницу. Я бы не сказал, что это самое удачное, но это в качестве примера.Ну наконец-то. Хоть в чем-то топик оказался полезным - вы таки соизволили найти определения операций для работы с бесконечностью.
А по-моему я здесь никому ничего не обязан. Не так ли?
Bogdanov AndreyВо первых, вместо одной неопределенности с делением на ноль пришлось узаконить кучу других (о чем я и писал с самого начала). То есть пятаясь доказать, что операция деления не приводит к неоднозначностям (а именно с этого все началось) вы ввели кучу других неоднозначностей (с делением при этом так и не разобрались).
Во-вторых, потеряны многие алгебраические свойства, которые были у поля рациональных чисел. Например, в поле для любого элемента есть обратный относительно сложения. Для ваших новых элементов обратных нет. Также наюблюдаются проблемы с дистрибутивностью. Например, в выражении (1-2)/0 скобки почему-то раскрыть нельзя. То есть нормальной алгебраической структурой ваше "расширенное множество" не является.
Еще раз - это не мое расширенное множество, на авторство я не претендую. То что бесконечность - особый элемент я писал еще 6 лет назад. Вы теперь в небольших вариациях с умным видом это повторяете, попутно обвиняя меня в том, что я в этом не разбираюсь. Да, и где там с делением не разобрались?
Так чей слив засчитывать?
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #37655988
Bogdanov Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркДа, и где там с делением не разобрались?
А вы свою ссылку читали? Там четко написано, что и после введения бесконечностей выражения 0/0 и бесконечность/бесконечность неопределены.

Локшин МаркЕще раз - это не мое расширенное множество, на авторство я не претендую.Но именно вы, не разобравшись в сути этого расширенного множества, решили использовать его в качестве примера для своих утверждений. Да еще и выдали "расширенное мнажество" за нечто общепринятое и общепризнанное. Я еще раз повторю, что в общем случае математика запрещает деление на ноль, а в некоторых узкоспециализированных теориях используют расширенные множества так как это позволяет упростить рассуждения. И это ни имеет никакого отношения к запугиванию детей. Еще не удалось посторить полноценную алгебраическую структуру для расширенного множества.

Локшин МаркТак чей слив засчитывать?Сначала вы написали, что (цитирую): "Выражение a/b интерпретируется всегда однозначно". Потом, когда вам указали, что не все так однозначно, вы пытаясь спасти ситуацию, приплели бесконечность. Но и с бесконечностью полной однозначности не появилось. Таким образом можно констатировать, что ваши апелляции к операции деления несостоятельны.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #37656075
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bogdanov AndreyА вы свою ссылку читали? Там четко написано, что и после введения бесконечностей выражения 0/0 и бесконечность/бесконечность неопределены.
А, вот о чем. Ну и чему это противоречит? Где я утверждал обратное?
Bogdanov AndreyНо именно вы, не разобравшись в сути этого расширенного множества, решили использовать его в качестве примера для своих утверждений. Да еще и выдали "расширенное мнажество" за нечто общепринятое и общепризнанное. Я еще раз повторю, что в общем случае математика запрещает деление на ноль, а в некоторых узкоспециализированных теориях используют расширенные множества так как это позволяет упростить рассуждения. И это ни имеет никакого отношения к запугиванию детей. Еще не удалось посторить полноценную алгебраическую структуру для расширенного множества.
Я-то в отличае от некоторых во всем и давно уже разобрался. А это "расширенное мнажество", как Вы его называете есть общепринятое и общепризнанное и используется отнюдь не в "некоторых узкоспециализированных теориях" (ну кому и мат. анализ, конечно, "некоторая узкоспециализированная теория"). И то, что Вы до этого о нем не слышали не означает, что это не общепризанное.
Bogdanov AndreyЛокшин МаркТак чей слив засчитывать?Сначала вы написали, что (цитирую): "Выражение a/b интерпретируется всегда однозначно". Потом, когда вам указали, что не все так однозначно, вы пытаясь спасти ситуацию, приплели бесконечность. Но и с бесконечностью полной однозначности не появилось. Таким образом можно констатировать, что ваши апелляции к операции деления несостоятельны.
Нет, мне там ничего и не указали. Особенно с примером 5/0, где я, видя к чему клонит softwarer, сказал что это даже совсем и определенно (как Вы выразились приплел бесконечность). Далее по Вашему тексту - два исключения - операция 0/0 и \infty/\infty - если уж так говорить, то "неопределено" можно тоже считать результатом операции, и в результате операция определена для всех возможных значений операндов (ну вот такой результат операции - "неопределено"). Чего для операций типа *= даже и не просматривается. Так что пример явно неудачный.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #37656266
Bogdanov Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Маркну вот такой результат операции - "неопределено" Лол.
У вас еще один вид результатов появился?
Сначала расширил множество бесконечностью, полугода не прошло, как сподобился сообщить описание операций для такого расширения. Теперь понадобился еще один элемент - "неопределено". Будете для этого элемента тоже операции описывать? А там появится еще один элемент "совсем неопределено"? А потом еще и еще...
Или все-таки закончим с троллингом? У меня вопросов больше нет.
...
Рейтинг: 0 / 0
Разница между запятой и JOIN
    #37656354
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bogdanov AndreyЛокшин Маркну вот такой результат операции - "неопределено" Лол.
У вас еще один вид результатов появился?
Сначала расширил множество бесконечностью, полугода не прошло, как сподобился сообщить описание операций для такого расширения. Теперь понадобился еще один элемент - "неопределено". Будете для этого элемента тоже операции описывать? А там появится еще один элемент "совсем неопределено"? А потом еще и еще...
Или все-таки закончим с троллингом? У меня вопросов больше нет.
Тьфу, ну сколько раз можно говорить, что не мое авторство. И насчет элемента "неопределено" - тоже. Усмехаться можете и дальше, только это идет не от понимания вопроса-то, а от его незнания.
А по сути - есть операция деления, есть два операнда, для каждого операнда определено значение операции (хорошо, если не нравится значение "неопределено", то четко прописано для каких определено, а для каких - нет, т.е. в определении оговорено поведение операции для всех операндов). В отличие от *=. Где формальная процедура определения неоднозначности (аналога неопределенности для деления)? Да, это формализуемо, но будет она далеко не тривиальной.
...
Рейтинг: 0 / 0
88 сообщений из 88, показаны все 4 страниц
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Разница между запятой и JOIN
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]