|
|
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Объясните мне, в чем разница между запросами: 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-ы, если можно перечислить таблицы, из которых хочешь сделать выборку и описать условия, по которым сопоставить строки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2006, 17:30 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
АрбайтерЗачем нужны JOIN-ы Низачем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2006, 20:07 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Арбайтер Зачем нужны JOIN-ы, Чтобы 1 отделить условие на соединение от условий на выборку. 2 повысить семантичность 3 более строго управлять порядком соединениями. 4 вообще строгость. Если чел написал CROSS JOIN, то он явно прописал свое намерение. А без этого поди догадайся - мож он ошибся. У Оракла, например, полно ограничений на внешние соединения. И он рекомендует outer join вмсето (+). Кроме того, есть естественные соединения - вообще без условий. А раз для этих соединений, то для единого стиля и для всех прочих нужен единообразный синтаксис. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2006, 01:44 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Ну давайте начнем очередной виток. vadiminfo1 отделить условие на соединение от условий на выборку. Хм. А можете ли Вы рассказать, для запроса с более чем одной таблицей, чем одно концептуально отличается от другого? Дать достаточно формальный алгоритм "логичного" выбора между вариантами Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. повысить семантичность Не понимаю, что имеется в виду, но видимо как-то связано с предыдущим пунктом. более строго управлять порядком соединениями. И зачем? Если учесть, что SQL как раз декларативен, и предписывает не алгоритм (в том числе порядок соединений), но описывает результат, который должен получиться. 4 вообще строгость. Если чел написал CROSS JOIN, то он явно прописал свое намерение. А без этого поди догадайся - мож он ошибся. В чем-то согласен. С другой стороны, CROSS JOIN - вещь весьма и весьма редкая, и только такой плюс никак не искупит все минусы подхода, например двойственный синтаксис. У Оракла, например, полно ограничений на внешние соединения. И он рекомендует outer join вмсето (+). Ну, надо смотреть, что лежит под этими рекомендациями, какое основание. Если основание - "подмазать комитет ANSI и за счет этого выторговать что-то другое", то это не то чтобы полноценный аргумент. Кроме того, есть естественные соединения - вообще без условий. И? Получается простой и понятный запрос, куда удачнее, нежели с дополнительным уродливым join-ом. Заодно - мне всегда очень прикольно видеть, как в синтаксис join-ов пытаются впихнуть такую вещь, как условия соединения, затрагивающие несколько таблиц разом. Скажем, Код: plaintext 1. vadiminfoА раз для этих соединений, то для единого стиля и для всех прочих нужен единообразный синтаксис. Хм. Лучшее, что можно сделать для единообразного стиля - это придумать второй стиль, причем не способный адекватно заменить первый. Интересная мысль :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2006, 18:38 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
2 softwarer На внутреннем соединения отличия не так ощутимы. Однако, даже здесь есть все-таки разница. Операция соединения и выборки все же разные в рел алгебре. А WHERE - больше выборка, и при "больших" условиях отличить там условия на соединения от прочих сложнее. Кроме того, кроме условия ON, может быть USING. В некоторых случаях это семантичнее. softwarer И зачем? Если учесть, что SQL как раз декларативен, и предписывает не алгоритм (в том числе порядок соединений), но описывает результат, который должен получиться. Ну как же? Операции в алгебре, к сожалению, не всегда ассоциативны - имеет значение что в первую очередь выполнить, что во вторую. В частности, при внешних соединениях такое может иметь место. Но это не нарушение деклративности - до реального алгоритма еще далеко. Но синтаксис с JOIN позволяет точно и однозначно определить порядок соединений. Например, неясности какие объединения внешние какие внутренние можно легче избежать. softwarer Ну, надо смотреть, что лежит под этими рекомендациями, какое основание. Если основание - "подмазать комитет ANSI и за счет этого выторговать что-то другое", то это не то чтобы полноценный аргумент. Возможно. не полноценный. Но какой ни на есть, а тоже говорит о том, что слишком много разного в WHERE не просто примирить. softwarer Заодно - мне всегда очень прикольно видеть, как в синтаксис join-ов пытаются впихнуть такую вещь, как условия соединения, затрагивающие несколько таблиц разом. Скажем, Но с другой стороны - мысль автора запроса выражена явно. Все-таки более строгая спецификация. Разве нет? softwarer Хм. Лучшее, что можно сделать для единообразного стиля - это придумать второй стиль, причем не способный адекватно заменить первый. Интересная мысль :) Я имел в виду, что польза для внешних соединений или от естественных соединений есть. Ну тада и для внутреннего из двух таблиц тоже лучше JOIN, чтобы не было тут запятые, тут JOIN. Чтобы тада уже во всех соединениях был JOIN. Так как автор спрашивал на примере внутреннего соединения из двух табл без сложных WHERE, где разница не ощутима. Конечно, это больше про приложения или там множество отчетов. А итерактивно один маленький запрос - конечно роли не играет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2006, 21:19 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
vadiminfoОперация соединения и выборки все же разные в рел алгебре. А стоит ли "пользователю SQL" об этом думать? Они связаны достаточно тесно, так, что формальный критерий разделения сформулировать непросто (во всяком случае, я его просил...) vadiminfoА WHERE - больше выборка, и при "больших" условиях отличить там условия на соединения от прочих сложнее. Придерживаюсь строго противоположного мнения. В сложных запросах становится важным то, что WHERE дает свободу записи, в то время как JOIN диктует порядок условий, и как следствие FROM становится очень трудночитаемым. Собственно, в одной из предыдущих дискуссий я просил оппонентов подсказать удачное форматирование JOIN, и так и не увидел хорошего варианта. Давайте посмотрим на пример: несколько таблиц с историей изменения записей. При использовании WHERE-соединений запрос можно записать примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Обратите внимание, здесь нет ни одного фильтра, в чистом виде соединение таблиц. С использованием JOIN это придется писать либо так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. - то есть условия смешены в кучу и плохо воспринимаются, либо использовать "частичный 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-синтаксис , сократив программный код примерно на треть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2006, 11:51 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2006, 13:33 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2006, 15:50 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Выскажусь как DBA. У нас в компании принято разрабатывать отчеты непосредственно на боевом сервере (насчет консерватории - не ко мне вопрос). Не используя JOIN и пропустив условие во WHERE любой программист может лугко поставить раком всю систему. Так частенько и случалось, пока не приказали использовать только JOIN. Конечно осталось немало других способов, но эта была достаточно большая проблема. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2006, 06:04 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Согласен с последним автором. И еще добавлю, что синтаксис с Join более строгий и как раз более легок для визуального восприятия, зато для динамического SQL синтаксис без них действительно более удобен. Так что нечего разводить тут "священные" войны, я использую тот, который удобней мне в конкретной задаче и ситуации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2006, 11:47 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
softwarer Давайте посмотрим на пример: несколько таблиц с историей изменения записей. При использовании WHERE-соединений запрос можно записать примерно так: ... Обратите внимание, здесь нет ни одного фильтра, в чистом виде соединение таблиц. С использованием JOIN это придется писать либо так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. - то есть условия смешены в кучу и плохо воспринимаются, либо использовать "частичный where-синтаксис", то есть половину условий соединения написать в join, а половину - в where.Что-то непонятно про "частичный where-синтаксис". По ходу, это вы сами такое понятие сочинили, нет? По определению, в предложении JOIN записываются только условия собственно соединения, то есть равенство или другая тета-операция (<, >, <=, >=, <>) на столбцах двух таблиц. Никакие другие условия вроде "a.date_apply between b.date_from and b.date_to" никак к операции соединения не относятся . По определению. Поэтому они должны быть записаны в предложении where. Все очень четко по теории, никаких неоднозначностей. Фильтру -- фильтрово, джойну -- джойново. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2006, 15:24 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
mirПо определению, в предложении JOIN записываются только условия собственно соединения, то есть равенство или другая тета-операция (<, >, <=, >=, <>) на столбцах двух таблиц. Никакие другие условия вроде "a.date_apply between b.date_from and b.date_to" никак к операции соединения не относятся . По определению. Поэтому они должны быть записаны в предложении where. Все очень четко по теории, никаких неоднозначностей. Фильтру -- фильтрово, джойну -- джойново. Блин, вот теоретики :-) Чем тебе between не то же самое, что пара неравенств с AND ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2006, 16:59 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
mirНикакие другие условия вроде "a.date_apply between b.date_from and b.date_to" никак к операции соединения не относятся .IMHO, несколько погорячимшись, это условие соединения, а не фильтра. Не обращаясь к источникам, опираясь только на IMHO, полагаю, что к условиям соединения относятся все условия, в которых происходит сравнение данных из одной таблицы с данными из другой таблицы. Хуже того, в случае внешних слияний даже сравнение поля с константой, обычно трактуемое как фильтр, вполне легально может перекочевать в условие соединения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2006, 17:06 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
2 problemsolver & ChA Надеюсь, это не покажется грубым, но пора, пора, ребята, перечитать определение операции тета-соединения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2006, 11:28 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
mirпора, ребята, перечитать определение операции тета-соединения.Хотелось бы узнать, что во фразе ChAк условиям соединения относятся все условия, в которых происходит сравнение данных из одной таблицы с данными из другой таблицыпротиворечит определению тета-соединения ? Следует ли считать, что пример от softwarer Код: plaintext 1. 2. 3. 4. 5. 6. 7. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Возможно, не прав, так как не могу считать себя теоретиком, но ни одно из доступных мне определений тета-соединения не противоречит написанию условия 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. Код: plaintext 1. 2. 3. 4. 5. 6. 7. Или мое непонимание сути проблемы гораздо глубже ? P.S. Уважаемый mir, будьте любезны, в следующий раз использовать аргументы несколько более содержательные, чем пора, ребята, перечитать . P.P.S. Напомните также, если несложно, какие условия правильно писать в ON, а какие в WHERE в случае внешних объединений, которые, если правильно понимаю, не относятся к тета-соединениям. В крайнем случае, укажите какой-либо доступный источник, в котором есть более весомые утверждения, чем mirФильтру -- фильтрово, джойну -- джойново. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2006, 02:32 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Готов признать, что по поводу тета-соединени я поторопился и был более категоричен, чем следует. Дело тут в чем. Оказывается, в литературе, как я обнаружил, есть разные определения Θ-соединения. Я ориентировался на определение, данное Дейтом в книге "Введение в системы баз данных". Если коротко, оно заключается в том, что условие соединения имеет вид (a Θ b), где a и b - имена атрибутов соединяемых отношений A и B, а Θ - операция сравнения (=, <, <=, <>, >, >=). Аналогичное определение дает C. Кузнецов . (Естественно, если соединение идет по нескольким атрибутам, то используется умножение нескольких условий, по числу пар атрибутов). В то же время в книге Гарсиа-Молина/Ульман/Уидом "Системы баз данных. Полный курс" дается несколько иное определение, при котором условие Θ-соединения не обязательно имеет вид (a Θ b), а может быть любым выражением. (Непонятно, правда, при чем здесь тогда тета). Таким образом, если принять за истину первый вариант, я прав. Если второй -- нет. Теперь -- мир? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2006, 08:01 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Я безусловно уважаю С. Кузнецова, у которого учился и которого считаю отличным преподавателем, и в том числе поэтому хотел бы подчеркнуть, что его определение ничуть не ограничивает сказанное мной в данном случае. Если, как Вы сами говорите, возможно соединение по нескольким парам атрибутов, никто не мешает (в определении нет такого запрета) соединить по парам (a, a) - (b1, b2). Я бы сказал, в процитированном определении дается попытка как раз дать такой формальный критерий отличия операции соединения от операции ограничения - соединение есть логическая операция над атрибутами разных отношений, ограничение есть логическая операция над атрибутом и константой (ну и - не помню, упомянуто там или нет - над атрибутами одного отношения). Вот с такой постановкой вопроса я уже не соглашусь (безусловно признавая, что она существует, я бы просто поспорил с полезностью такой теории). Я полагаю, что суть важнее формы; в частности, я не вижу разницы (в том числе с точки зрения реализации хорошей БД) между запросами, например Код: plaintext 1. 2. или Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2006, 10:25 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
vadiminfoПользователю SQL лучше об этом думать - он же работает с реляционной БД. И если не будет об этом думать, то может не увидеть из-за деревьев леса. Объясните, пожалуйста, какого именно леса (нуждающегося во внимании) не увидит пользователь. "Формально разные операции" - пользователю согласитесь, пользователю интересно не более, нежели формальная разница между целочисленным и вещественным сложением. Мало того, сама формальная разница - сомнительна. Вольно пересказывая того же Кузнецова - операция соединения не относится к базовым, реализуема через базовые и упоминается лишь потому, что является практически очень важным частным случаем. vadiminfoТ.е. вы говорите, что они смешаны, а потом что полнвина в join половина в where. Я этого не говорю. Я говорю, что в данном примере придется либо свалить все в невоспринимаемую кучу в join, либо таки использовать where для записи части условий соединения. vadiminfo softwarer Это редко существенно, и в этих редких случаях никто не мешает использовать скобки. Но эти редкие случаи могут приводить к ошибкам и большей возне при выяснении почему не правильно работает запрос? Не более чем в join-синтаксисе. Например, лично я не отношу к "интуитивно понятным" тот факт, что в запросе Код: plaintext 1. 2. в результате запросто окажутся записи с 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 они в первую очередь делают запрос лучше читаемым (облегчают основной запрос). Ну и само собой, дают весьма полезные дополнительные возможности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2006, 11:07 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
softwarerНе более чем в join-синтаксисе. Например, лично я не отношу к "интуитивно понятным" тот факт, что в запросе Код: plaintext 1. 2. в результате запросто окажутся записи с b.type, отличным от 5. Опа - как это у нас получится ? Данный запрос в итоге с учетом наложение на внешнее соединение фильтра будет эквивалентен прямому соединению и к примеру в ASA так и будет стоять INNER JOIN в плане запросов (что есть логично и правильно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2006, 14:41 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Кстати еще интересно, как написать через 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" внешним, что бывает актуально при соединении таблиц с большим числом записей в сложных запросах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2006, 14:45 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
ASCRUSОпа - как это у нас получится ? Хм. И в самом деле любопытно. Утром у меня получилось :) Давайте пока примем в качестве рабочей гипотезы, что я был очень непроснувшимся, а я попробую повторить тот эксперимент, который дал такой результат. Утром он меня тоже удивил, но я решил, что это фича :) OK, тогда скажу то, что собственно говоря собирался сказать до этого эксперимента - я не вижу разницы в легкости внести ошибку между вариантами Код: plaintext 1. 2. 3. 4. 5. 6. А насчет "интересно" - если мне не изменяет память, я показал это еще в прошлом обсуждении, где Вы задали такой же вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2006, 14:59 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
mirТаким образом, если принять за истину первый вариант, я прав. Если второй -- нет.Мне по-прежнему хотелось бы получить от Вас четкий критерий, когда условия помещаются в ON, а когда в WHERE, и не только в случае тета-соединения. Мой вариант был изложен ранее , теперь хотелось бы увидеть Ваш. Уверен, что он будет теоретически более строг и однозначен, в отличие от моего. P.S. По поводу различия определений тета-соединения. IMHO, главное и общее во всех них то, что условие Θ-соединения представляет собой некую функцию над столбцами участвующих отношений, которая должна возвращать TRUE для соответствующих пар кортежей, а не применимость between в этом контексте в сравнении с = , > , < , и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2006, 17:57 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
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 написан без проекций в подзапросах, исключающих «неожиданные» условия соединения, которые могут появиться позже – добавили новые поля с одинаковыми именами, то да я против такого. И не рекомендую использовать это начинающим в боевом коде, пока они не представляют себе всех последствий. В противном случае исключение вообще условий на соединения, особенно тех, что Вы называете основными – значительно улучшает чтение запроса. Т.е. пропадает вообще вопрос от том что куда переносить. О чем мы говорили выше. Поди плохо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2006, 18:00 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
softwarerне вижу разницы в легкости внести ошибку между вариантами Оригинальный подход к сравнению синтаксиса. Хотя из этого может следовать отсутствие различия даже между разными языками. Мощно, стоит запатентовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2006, 18:10 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
ChAОригинальный подход к сравнению синтаксиса. Вот поэтому я не люблю беседовать на флеймовые темы с несколькими людьми одновременно. Обязательно рано или поздно кто-нибудь выхватит фразу из контекста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2006, 20:00 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Как-то все запутано у вас выходит. 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 Так о чем идет спор? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2006, 12:18 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Локшин МаркНо что касается внешних соединений, то ответ на вопрос по-моему уже давно содержится в BOL к MS SQL Еще во время прошлого обсуждения этого вопроса было показано, что убогая реализация *= в MSSQL никоим образом не является аргументом при обсуждении чего-либо кроме MSSQL. Повторять двадцать страниц того топика, честно говоря, не хочется; пожалуйста воспользуйтесь поиском (это было в "Сравнение СУБД", название топика к сожалению не помню). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2006, 12:44 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
softwarerЕще во время прошлого обсуждения этого вопроса было показано, что убогая реализация *= в MSSQL никоим образом не является аргументом при обсуждении чего-либо кроме MSSQL. Повторять двадцать страниц того топика, честно говоря, не хочется; пожалуйста воспользуйтесь поиском (это было в "Сравнение СУБД", название топика к сожалению не помню). Если Вы про это /topic/7615&pg=17 то все равно не понял. Ткните пальцем, где там про убогую реализацию *= в MS SQL и почему именно из-за этой особенности реализации появляется неоднозначность. Она и в Oracle c (+) должна быть, насколько я понимаю. И скобками в where делу не поможешь, хоть все по 10 раз в них заверни ибо операция и не ассоциативна и не коммутативна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2006, 20:03 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Локшин МаркЕсли Вы про это Нет, не про это. Вроде как обсуждение было не так давно; беседовали мы в основном с pkarklin , и в итоге он не смог привести примера, который я бы не смог корректно реализовать с использованием (+) Локшин МаркИ скобками в where делу не поможешь А кто говорит про скобки в where? :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2006, 20:22 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
softwarerНет, не про это. Вроде как обсуждение было не так давно; беседовали мы в основном с pkarklin, и в итоге он не смог привести примера, который я бы не смог корректно реализовать с использованием (+) Что-то не нашел, где вы там с ним чего выясняли, кнопочка все (с некоторых пор???) на больших темах не работает, а лазить по всем и нажимать постранично как-то не удобно и долго выходит. Но по-моему вот простейший пример (ну или ссылку тогда на тему дайте, если это уже было): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2006, 22:22 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Локшин Марк Код: plaintext 1. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2006, 22:44 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Локшин Марк Код: plaintext 1. 2. 3. 4. Кстати, отмечу, что в случае Oracle здесь никакой неоднозначности не будет - будет ошибка. Что пожалуй правильнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2006, 23:49 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
softwarerКстати, отмечу, что в случае Oracle здесь никакой неоднозначности не будет - будет ошибка. Что пожалуй правильнее. Ну так и в MS SQL тоже будет на этот запрос: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2006, 10:15 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Локшин МаркНу так и в MS SQL тоже будет на этот запрос: А к чему тогда относится ранее процитированная фраза насчет возможности неоднозначной интерпретации? Локшин МаркПо поводу вашего варианта. Запросы то эквивалентные, Я бы особо отметил, что не просто запросы эквивалентные, но и их алгебраическая запись одинакова. Локшин Маркно это извините не только соединение в условии фильтрации, а соединение в условии фильтрации + еще и подзапрос с соединением в условии фильтрации. Что как-бы вещи IMHO немного разные. Чем именно? Ваши скобки в join-е - это ровно такой же подзапрос, просто неявно оформленный. Локшин МаркЯ не говорю, про чисто субъективную вещь как это будет смотреться при 5-6 последовательных outer join' ах. И все неоднозначные? Не уверен, что хоть раз в жизни встречал такой запрос :) Я бы хотел сразу определить обсуждаемое утверждение. Если мы говорим о "лучшем варианте синтаксиса в той или иной ситуации", я согласен с тем, что в некоторых ситуациях join-синтаксис предпочтительнее. Если мы сравниваем синтаксисы, так или иначе говорим о "лучше было бы везде использовать единый синтаксис, и это должен быть такой-то", то повторю - любой аргумент вида "лучше в 1% случаев" должен быть очень весок, чтобы перебороть "хуже во всех оставшихся случаях". Локшин МаркНо от таких вот выкрутасов оптимизатор у вас в какой-нибудь раз забудет об индексе/статистике Хм. Обещаете? Вот тут я сошлюсь на сказанное выше - у этих запросов одинаковая алгебраическая запись. Если бы мои программисты принесли мне оптимизатор, способный построить для них разные планы - я бы послал их.... переделывать работу с начала. Потому что это означает принципиально некорректное проектирование оптимизатора. Простите, но даже думать об этом варианте не вижу смысла. Впрочем, заодно для полноты картины могу подкинуть контрпример, относящийся как раз к попытке исправить "неправильное поведение оптимизатора". В where-синтаксисе возможно написать так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Было бы интересно посмотреть на аналогичную запись в случае ansi join-ов. Локшин МаркЗачем усложнять жизнь и себе и оптимизатору? Ну в общем-то см. выше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2006, 12:25 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
softwarerА к чему тогда относится ранее процитированная фраза насчет возможности неоднозначной интерпретации? Ну такая запись дает возможность неоднозначной трактовки запроса, что тут не понятного. softwarerЯ бы особо отметил, что не просто запросы эквивалентные, но и их алгебраическая запись одинакова. А я бы этого не отмечал, так как это не верно. Как-то Вы так лихо выкинули оператор переименования атрибутов и отношения. Ни разу она и не одинакова. softwarerЧем именно? Ваши скобки в join-е - это ровно такой же подзапрос, просто неявно оформленный. Join - это join, а подзапрос - это подзапрос. А Left join - это left join. Всем изместно, что система опраторов реляционной алгебры не минимальна, и одни выражаются через другие. softwarerЕсли мы сравниваем синтаксисы, так или иначе говорим о "лучше было бы везде использовать единый синтаксис, и это должен быть такой-то", то повторю - любой аргумент вида "лучше в 1% случаев" должен быть очень весок, чтобы перебороть "хуже во всех оставшихся случаях". А зачем хуже? Достаточно - лучше в некоторых, и не хуже в остальных. softwarerХм. Обещаете? Вот тут я сошлюсь на сказанное выше - у этих запросов одинаковая алгебраическая запись. Если бы мои программисты принесли мне оптимизатор, способный построить для них разные планы - я бы послал их.... переделывать работу с начала. Потому что это означает принципиально некорректное проектирование оптимизатора. Обещаю, более того, наблюдал такое поведение в MS SQL, правда на более сложных запросах. И запись, как выясняется, вовсе не одинаковая. И программистов никто не посылает... По поводу примера, что за хинты такие Код: plaintext 1. Ну а про ответ, я думаю, Вы догадываетесь? Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2006, 10:00 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Локшин Марк softwarerА к чему тогда относится ранее процитированная фраза насчет возможности неоднозначной интерпретации? Ну такая запись дает возможность неоднозначной трактовки запроса, что тут не понятного. Трактовки кем? Сервером? Так вроде бы согласно последней версии сказанного Вами он трактует такой запрос однозначно и правильно - как ошибочный. Трактовки программистом? Хм, какая собственно разница, как именно он трактует ошибочный запрос? Кем еще? Локшин МаркКак-то Вы так лихо выкинули оператор переименования атрибутов и отношения. Переименование появилось только потому, что Вы использовали звездочку, что в нормальном коде недопустимо само по себе. В нормальной записи Вашего варианта было бы то же переименование. Локшин МаркВсем изместно, что система опраторов реляционной алгебры не минимальна, и одни выражаются через другие. По-Вашему получается, что не "всем", но "всем, кроме оптимизатора". Который почему-то обязан от этого сглупить. Локшин Марк softwarerЕсли мы сравниваем синтаксисы, так или иначе говорим о "лучше было бы везде использовать единый синтаксис, и это должен быть такой-то", то повторю - любой аргумент вида "лучше в 1% случаев" должен быть очень весок, чтобы перебороть "хуже во всех оставшихся случаях". А зачем хуже? Достаточно - лучше в некоторых, и не хуже в остальных. Было бы достаточно. Но поскольку "не хуже в остальных" отсутствует - недостаточно. Локшин МаркОбещаю, более того, наблюдал такое поведение в MS SQL, правда на более сложных запросах. Хм. Вы кажется обещали, что оптимизатор навернется "у меня", а не "в MS SQL". Если говорить о последнем - согласно утверждениям pkarklin *= в нем просто плохо реализован (недостаточно функционален). Лично я сделал в MSSQL один проект, имея целью в основном пощупать работу с ним, и ничуть не огорчусь, если больше никогда не доведется иметь с ним дело. Локшин МаркНу а про ответ, я думаю, Вы догадываетесь? Догадываюсь. Привел как раз чтобы показать, что с точки зрения "управления оптимизатором" продемонстрированное Вами преимущество имеет и оборотную сторону, и приходится таки использовать запись "в моем стиле". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2006, 11:54 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
softwarerТрактовки кем? Сервером? Так вроде бы согласно последней версии сказанного Вами он трактует такой запрос однозначно и правильно - как ошибочный. Трактовки программистом? Хм, какая собственно разница, как именно он трактует ошибочный запрос? Кем еще? Так потому что такой способ записи порождает неоднозначности в интерпритации запроса, что есть очень плохо - значит способ записи дурной. Было бы весьма странно, если бы сервер его исполнял то так, то этак. softwarerПереименование появилось только потому, что Вы использовали звездочку, что в нормальном коде недопустимо само по себе. В нормальной записи Вашего варианта было бы то же переименование. Да? Код: plaintext 1. softwarerПо-Вашему получается, что не "всем", но "всем, кроме оптимизатора". Который почему-то обязан от этого сглупить. Если Вы думаете, что оптимизатору преобразовать запрос к эквивалентному, который быстрее выполняется очень просто, то Вы ошибаетесь. Так зачем его еще и путать лишний раз? softwarerВы кажется обещали, что оптимизатор навернется "у меня", а не "в MS SQL". Уверен, что рано или поздно и в Oracle навернется. softwarerДогадываюсь. Привел как раз чтобы показать, что с точки зрения "управления оптимизатором" продемонстрированное Вами преимущество имеет и оборотную сторону, и приходится таки использовать запись "в моем стиле". Ммм... эээ.... а где я говорил, что я не использую подзапросов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2006, 12:27 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Локшин МаркТак потому что такой способ записи порождает неоднозначности в интерпритации запроса, что есть очень плохо - значит способ записи дурной. Было бы весьма странно, если бы сервер его исполнял то так, то этак. Хм. Я перестал понимать, то ли я идиот, то ли Microsoft так старательно затуманил простую вещь, то ли это делаете Вы. Насколько я вижу, Вы говорите примерно следующее: "выражение 1/0 не может быть однозначно интерпретировано, а следовательно способ записи a/b дурной". Я этой логики не понимаю, поэтому предлагаю свернуть эту часть обсуждения. Да, последний вопрос: обрабатывал ли такие запросы MSSQL когда-нибудь или таки во всех версиях выдавал ошибку? Ну и где? Где отношение d? Где переименование? Кажется, наконец-то до меня дошло, что Вы уделяете очень большое значение форме. Увы, в рамках такой концепции ответить не смогу, поскольку предпочитаю говорить о сути. В моем понимании мира - отношение d внутри скобок, а переименование там, где этот селект будет использован. Локшин МаркЕсли Вы думаете, что оптимизатору преобразовать запрос к эквивалентному, который быстрее выполняется очень просто, то Вы ошибаетесь. Если Вы полагаете, что я имел в виду именно это, то Вы ошибаетесь; если не полагаете, то наводите тень на плетень. Я полагаю, что любой хороший алгоритм обязан на эквивалентных данных давать одинаковый результат. Гиперболизируя - если алгоритм зависит от того, записана ли в SQL константа как "1", "1.0" или "1E0", это хреновый алгоритм. Локшин МаркТак зачем его еще и путать лишний раз? Кстати, почему Вы считаете "путать"? Если есть неэквивалентность - 50% шансов за то, что именно "моя" запись даст более эффективный план. Локшин МаркУверен, что рано или поздно и в Oracle навернется. Ну.. удачи. Как я понимаю, Вы предлагаете ухудшать каждое приложение, основываясь на лично Вашей уверенности, что "иначе рано или поздно навернется". Для меня это чем-то сродни предложению окружать каждую подпрограмму пустым блоком отлова исключений. Локшин МаркМмм... эээ.... а где я говорил, что я не использую подзапросов? А где я говорил, что Вы их не используете? Вы показали, что "такая запись может быть лучше, потому что". Я показал, что она по этой же причине может быть хуже. Какой из этого следует вывод? С моей точки зрения - "этот аргумент не позволяет судить о преимуществах той или иной записи". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2006, 13:00 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
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 в боевом коде, лично я испытаю сильное желание выкинуть автора этого кода за дверь." Такое значение незначительному вопросу? Это что-то больше психологическое, чем технологическое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2006, 14:27 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
mirУдивлен, что есть радикалы (softwarer), с фразами вроде "Увидев natural join в боевом коде, лично я испытаю сильное желание выкинуть автора этого кода за дверь." Такое значение незначительному вопросу? Это что-то больше психологическое, чем технологическое. Вы, безусловно, можете считать это незначительным вопросом. Я же считаю это непониманием технологии разработки качественного программного обеспечения. Запрос, использующий natural join в любом его виде, может быть затронут (стать неверным) из-за мелкого изменения в БД либо в удаленной по тексту части этого запроса. Его использование в боевом коде - примерно то же, что передача параметров подпрограммы через разделяемые глобальные переменные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2006, 15:01 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
mirСчитаю, что это позволяет сделать запрос нагляднее: обычно быстро пробежал глазами по FROM, понял что с чем соединяется, а потом в WHERE осмысляю все остальные условия выборки.Пример Код: plaintext 1. 2. 3. Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2006, 15:15 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
ChA mirСчитаю, что это позволяет сделать запрос нагляднее: обычно быстро пробежал глазами по FROM, понял что с чем соединяется, а потом в WHERE осмысляю все остальные условия выборки.Пример Код: plaintext 1. 2. 3. Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2006, 17:17 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
softwarer mirУдивлен, что есть радикалы (softwarer), с фразами вроде "Увидев natural join в боевом коде, лично я испытаю сильное желание выкинуть автора этого кода за дверь." Такое значение незначительному вопросу? Это что-то больше психологическое, чем технологическое. Вы, безусловно, можете считать это незначительным вопросом. Я же считаю это непониманием технологии разработки качественного программного обеспечения. Запрос, использующий natural join в любом его виде, может быть затронут (стать неверным) из-за мелкого изменения в БД либо в удаленной по тексту части этого запроса. Его использование в боевом коде - примерно то же, что передача параметров подпрограммы через разделяемые глобальные переменные.Нельзя ли привести пример изменения в БД, которое може повлиять только на запросы с natural join и больше ни на что? Про "удаленную по тексту часть этого запроса", честно, не понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2006, 17:22 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
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, а не выношу соединения в подзапросы. Я лучше над другими вещами подумаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2006, 21:22 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Локшин МаркЗаметим на 0, а на все остальные числа - можно. Т.е. какие-либо проблемы появляются при конкретных значениях переменных. Запись с *= неоднозначна при любых значениях "Значением" в случае этой операции является связываемая таблица. И запись неоднозначна далеко не при всех значениях, скорее при "очень некоторых". Локшин МаркКак будет выглядит критерий для *= соединения? Подключаемая по внешнему соединению таблица соединяется с одной и только с одной базовой таблицей. Локшин МаркКакова сложность его проверки "в уме"? Хм. Этот вопрос меня немного смущает. Дело в том, что этот критерий проверяется без участия ума, просто глазами, ну а сервер со своей стороны проведет ровно ту же проверку. Локшин МаркТогда Вы по всей видимости должны знать, что хороших с вашей точки зрения алгоритмов исполнения запроса еще не изобретено... Достаточно хорошие - изобретены. Идеальных, конечно, нет. Локшин МаркОпять же, аналогия несколько натянута. Это не аналогия, а гипербола (в моем тексте было употреблено именно это слово). Гиперболе, если угодно, по статусу положено быть несколько натянутой; ее предназначение - выпятить нечто, что в исходном объекте недостаточно заметно. Локшин МаркВы рассуждаете как в том анекдоте "Какова вероятность встретить динозавра, выйдя на улицу...". Безусловно. В данном случае Вы занимаете довольно категоричную позицию - "ухудшит и все тут", которой я противопоставляю столь же категоричную "а с тем же успехом и улучшит". Скажем так, оптимизаторы имхо весьма преуспели в разворачивании подзапросов (Вы собственно говорите об этом дальше) и практически мне иногда приходилось запрещать оптимизатору такой разворот, но не припомню, чтобы приходилось понуждать его. Локшин МаркТак что в свете вышесказанного я не понимаю, почему это ухудшение. Наверное, мне следовало быть более аккуратным в формулировках. С точки зрения эффективности я нисколько не собираюсь настаивать на каком-то обязательном ухудшении ситуации при использовании ansi join-ов. Я в данном случае имел в виду тему более ранней части беседы - удобство их использования, читаемость запросов итп. Локшин Марк...... А если вложенность побольше сделать? Запутается, и глазом не моргнет. Итого: имеем некий незначительный процент запросов, на которых оптимизатор имеет шанс запутаться. Некоторые наверное таки запутаются. Имеем выбор: то ли помочь оптимизатору в конкретных редких случаях, тем же хинтом, то ли строить всю технологию под конкретный редкий случай. Не сказал бы, что второй вариант выглядит однозначно верным выбором. Локшин МаркБрр... ничего не понял. Выше я привел свой вариант, чем он хуже? Не обойтись без подзапроса - пишите подзапрос. Хм. Давайте вспомним сначала. Вы обосновываете точку зрения, что join-синтаксис лучше, согласны? Сначала Вы попытались показать, что он позволяет НЕЧТО. Я показал, что это НЕЧТО возможно и в where-синтаксисе. Тогда Вы начали обосновывать то, что вариант с подзапросом хуже. Я показал, что и в join-ах отказаться от подзапросов не удастся. Жду нового принципиального аргумента... Если принципиальных аргументов нет - остается то, о чем говорю я, то есть аргументы количественные. Если, допустим, "скобки в 10% хуже" - это одно; если "скобки в 10% хуже, но в join-ах в 10% случаев их все равно приходится использовать" - это уже немного другое. Хотя в любом случае напальцевые рассуждения о весах, вопрос вкусов в чистом виде. Локшин МаркПросто мне не нужно думать, когда *= написать, а когда left join, т.к синтаксис с *= неоднозначен Вернулись к вопросам религии. Мне точно так же не нужно думать, когда писать (+), а когда left join, поскольку второй я никогда (исключая эксперименты в подобных беседах) не пишу. Локшин МаркЯ лучше над другими вещами подумаю. Угу. И эти вещи будут - как понять запрос, в котором относящиеся к одному и тому же условия разнесены на полторы страницы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2006, 12:56 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
softwarerИ запись неоднозначна далеко не при всех значениях, скорее при "очень некоторых". Я имел ввиду конкретный пример, который привел выше. softwarerПодключаемая по внешнему соединению таблица соединяется с одной и только с одной базовой таблицей. Маловата будет (c). Часто требуется больше. Walk around Вы продемонстрировали, но это именно (IMHO) этим и является. softwarerДело в том, что этот критерий проверяется без участия ума, просто глазами, Пишу запросы не выходя из коматозного состояния что-ли? Меня вот Ваш ответ смущает. softwarerну а сервер со своей стороны проведет ровно ту же проверку. Ну про сервер никто не говорит. softwarerЯ показал, что это НЕЧТО возможно и в where-синтаксисе. С введением подзапросов. Ну я left join можно и по-другому еще выразить... softwarerТогда Вы начали обосновывать то, что вариант с подзапросом хуже. Я показал, что и в join-ах отказаться от подзапросов не удастся. Э... погодите. IMHO у Вас все же проскакивает мысль, что я считаю, что "от подзапросов можно отказаться". Это не так, просто не нужно их (IMHO) необоснованно вводить. softwarerУгу. И эти вещи будут - как понять запрос, в котором относящиеся к одному и тому же условия разнесены на полторы страницы. Да и у Вас также получится с подзапросом, причем часть условий соединения во FROM, часть в WHERE перемешанные с условиями фильтрации будут. И отношение вы переименовываете, т.е. по человеку изучая запрос нужно помнить что Вы и как переобозначили по отношению к стандартной схеме БД. Я стараюсь (при возможности, конечно) такой ситуации избегать. PS. Ну а то, что вопросы эффективности восприятия можно отнести к "вопросам религии" - согласен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2006, 14:33 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Локшин Марк 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. Я избегаю как раз такого вот заикания. Причин для этого две - во-вторых, этот подход становится неприменимым при нескольких подключениях в запрос одной и той же таблицы, а во-первых я полагаю более практичным использовать значимые с точки зрения роли в конкретном запросе алиасы и сокращать ими запись, фокусируя внимание на собственно сути запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2006, 18:17 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
softwarer Вы, безусловно, можете считать это незначительным вопросом. Я же считаю это непониманием технологии разработки качественного программного обеспечения. Запрос, использующий natural join в любом его виде, может быть затронут (стать неверным) из-за мелкого изменения в БД либо в удаленной по тексту части этого запроса. Его использование в боевом коде - примерно то же, что передача параметров подпрограммы через разделяемые глобальные переменные. Даже если в запросе участву.т проекции? Т.е. строгий перечень полей изменеие, которых в любом случае сделает и другие запросы "неверными" (скорей всего при таких изменниях БД и запросы нужны другие)? Трудно представить себе качественное программное обеспечение с использованием (+). Это все-таки рудименты прошого, отвегнутые в стандартах. А без стандартов о каком качестве можно говорить? (+) тогда тоже можно сравнить с заплатками в коде - использовались за не имением лучшего. Даже производители не рекомендуют. Какое там еще качество боевого кода? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2006, 19:13 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
vadiminfoДаже если в запросе участву.т проекции? Т.е. строгий перечень полей Даже. Потому что альтернатива - добавляя необходимое поле в подзапрос, не забыть отмотать текст на пару страниц вниз и посмотреть, не участвует ли этот запрос в natural join, после чего отмотать на страницу вверх и посмотреть, нет ли случайно одноименного поля в другом подзапросе. И это необходимо делать каждый раз из-за того, что его автор поленился один раз набрать несколько дополнительных символов. Ну а тем временем другой программист, решив, что во втором подзапросе использован не очень удачный алиас, переименовывает его и таки ломает natural join. vadiminfoизменеие, которых в любом случае сделает и другие запросы "неверными" (скорей всего при таких изменниях БД и запросы нужны другие) Да бросьте. Добавление нового поля в таблицу или в запрос - если и не самая частая операция мелкой доработки, то точно одна из таковых. vadiminfoТрудно представить себе качественное программное обеспечение с использованием (+). Это все-таки рудименты прошого, отвегнутые в стандартах. Стандарт на перебегание улицы перед идущим автотранспортом вовсе не убедит меня рисковать своей жизнью. Вас убедит? vadiminfoА без стандартов о каком качестве можно говорить? Простите, демагогия. vadiminfo(+) тогда тоже можно сравнить с заплатками в коде - использовались за не имением лучшего. Даже производители не рекомендуют. Какое там еще качество боевого кода? Сравните, не возражаю. Собственно классический вопрос - Вам шашечки или ехать? Мне - ехать, то есть хорошо работающую, качественную программу. Вам.... Чтобы обосновать Ваше утверждение, Вам придется доказать, что использование нестандартизованной фичи есть нарушение стандарта ANSI SQL, нарушение стандарта ANSI SQL эквивалентно работе "без стандартов вообще", а работа "без стандартов вообще" неизбежно ведет к некачественному коду. Сумеете? Как минимум второй пункт вызывает у меня большие сомнения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2006, 19:32 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
softwarer Даже. Потому что альтернатива - добавляя необходимое поле в подзапрос, не забыть отмотать текст на пару страниц вниз и посмотреть, не участвует ли этот запрос в natural join, после чего отмотать на страницу вверх и посмотреть, нет ли случайно одноименного поля в другом подзапросе. И это необходимо делать каждый раз из-за того, что его автор поленился один раз набрать несколько дополнительных символов. Ну а тем временем другой программист, решив, что во втором подзапросе использован не очень удачный алиас, переименовывает его и таки ломает natural join. Какой-то сложный процесс программирования. Непонятно када и что они там делают с этим запросом. Была речь про изменения, которые повлияют на NATURAL JOIN, но не повлияли бы на запятые. Вот присмеры проясните траблу, про которую говорите Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. Естественное соединение - классика. А второй что? - Декартово соединение с выборкой из него? Да и то что это соединение даже декартово не написано явно. Просто список таблов. Ну не знаю даже - как-то из Обнинска через Калугу в Москву. Теперь грите про подвохи. Мож я не заметил? softwarer Да бросьте. Добавление нового поля в таблицу или в запрос - если и не самая частая операция мелкой доработки, то точно одна из таковых. Я имел в виду, что это добавление влияет или нет одинаково на оба синтаксиса. Вот пример написан в предыдущем абзаце. Добавьте поля в таблы. Какая разница? А если ID переименуете, то оба запроса плетят. Кстати? а если без под запроса и id в двух переименуете или добавите в обе одинаковые поля по которым действительно должны быть соединение вместо старого, так NATURAL JOIN менять не придется, а с запятыми придется. Так что формально можно найти случаи када он устойчивей к измениям. softwarer Стандарт на перебегание улицы перед идущим автотранспортом вовсе не убедит меня рисковать своей жизнью. Вас убедит? Речь была о качестве. Для него стандарты имеют значение. На западе стандарты демократичны и отражают по мере сил точки зрения всех заинтересованных сторон и производителей и потребителей. softwarer Простите, демагогия. Не думаю. Качество предполагает соответсвие стандартам. Это должно давать много пользы. Например, такой запрос быстрей поймут проггеры разных СУБД. Это относится к качеству. softwarer Сравните, не возражаю. Собственно классический вопрос - Вам шашечки или ехать? Мне - ехать, то есть хорошо работающую, качественную программу. Вам.... Мне то же. плюс стиль упрощающий сопровождение и разработку. softwarer Чтобы обосновать Ваше утверждение, Вам придется доказать, что использование нестандартизованной фичи есть нарушение стандарта ANSI SQL, нарушение стандарта ANSI SQL эквивалентно работе "без стандартов вообще", а работа "без стандартов вообще" неизбежно ведет к некачественному коду. Сумеете? Как минимум второй пункт вызывает у меня большие сомнения. JOIN введен начиная с SQL2 и выше. Тока первом внешних соединений не было, а для внутренних запятая. У качественного кода, наверное, несколько критериев. Один из них соответствие стандартам. Это позволяет легче воспринимать разным проггерам. Это влияет на сопровождение и разработку. В том числе даже допускает перенос на другую РСУБД. Тем более, что многие, например, фокспрошники работают сразу с несколькими СУБД. Чеж тут еще обосновывать то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2006, 22:37 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
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 согласен. По мне, так уж лучше я явно должен буду добавлять условие соединения в запросе, чем сервер мне надобавляет их автоматом там, где не нужно всего лишь из-за того, что совпали названия атрибутов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2006, 00:35 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Локшин Марк А вот здесь я с softwarer согласен. По мне, так уж лучше я явно должен буду добавлять условие соединения в запросе, чем сервер мне надобавляет их автоматом там, где не нужно всего лишь из-за того, что совпали названия атрибутов. Вы, наверное, не совсем поняли смысл фразы. Там было сказано слово "формально". Формально нельзя сказать, что даже в том опасном применении NATURAL JOIN всегда менее устойчив к изменениям. И на самом деле сервер автоматом не надобавляет, а просто выполнит то что написано -а надобавляли руками парни в БД. Причем второе одинаковое поле, но не имея в виду соединение. Не уверен, что это хорошие парни. Но у нас так делают иногда некоторые - добавляли када апгрэйдили, что-то там заливали наспех. А потом забыли удалить, хотя оно не нужно. Ничего о том, что так использовать NATURAL JOIN лучшее из лучшего сказано не было. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2006, 01:04 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
NATURAL JOIN как мне кажется не сильно хорош тем, что тупо связывает по одинаковым именам полей. В этом плане KEY JOIN гораздо приятнее, так как для связи таблиц оптимизатор использует поля, указанные в FK, типа того: Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2006, 10:43 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
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Чеж тут еще обосновывать то? Хм. Обычно это звучит, когда обосновать не удается :) Что ж. Итак, Вы четко заняли позицию "СУБД-независимого кода" как главного критерия качества. Предлагаю здесь это не обсуждать а вновь поднять один из вечных топиков типа "давайте программировать не зная конкретную СУБД". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2006, 12:07 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
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 Предлагаю здесь это не обсуждать а вновь поднять один из вечных топиков типа "давайте программировать не зная конкретную СУБД". Если Вы про меня, то я могу сказать - программируйте тока на Оракле. Но чем больше стандартов при прочих равных равных условиях, тем лучше. Вы все-таки сторнник крайностей - раз не удается полностью все делать в соотвествии со, то откажемся от них ваще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2006, 13:08 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Локшин МаркЕще раз повторяю - выражение 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 - безусловно, вопрос религии, согласен. Но у меня Вы такого не найдете. Я сказал, что свобода записи в WHERE позволяет сгруппировать и оформить условия "максимально логично" с персональной точки зрения того, кто пишет запрос. Требуя от меня формализации этой максимальной логичности, Вы профанируете эту свободу; Вы требуете от меня создания некоей "правильной для всех и всегда" точки зрения; как раз того, что сделали создатели join-ов и что мне решительно не нравится. В этом смысле получается примерно так: я пришел к автоконструктору с мотоциклом, а он говорит: "сначала прикрути еще два колеса, а уж тогда я покажу тебе, чем эта конструкция неудачна". Локшин МаркЭто когда вы пишите, может и быстрее сократить, а через год будете вспоминать, Клянетесь? Я бы все же посоветовал не давать столь опрометчивых обещаний относительно меня и используемой мной технологии. Также замечу, что если привыкнете давать толковые имена, а не "быстрее сократить" - скорее всего и у Вас такой проблемы не будет. Локшин МаркВ этом случае неприменим (я же оговорился про это), но можно, например, приписывать суффикс к отношению. Можно. Собственно, этот вопрос - отдельная большая тема, со своими плюсами-минусами в каждом из рассматриваемых случаев. Я собственно в основном хотел уточнить, что Вы имели в виду - этот вариант или еще что-нибудь. А насчет "можно".. если обратите внимание, мы сейчас оказались в позиции, абсолютно симметричной относительно исходного обсуждаемого вопроса. По поводу join-ов: вы говорите, что метод позволяет в большем количестве случаев выдержать единый стиль и не писать лишнего подзапроса, я полагаю, что изредка писать этот "лишний подзапрос" - удачная плата за другие преимущества метода. По поводу именований: я говорю, что метод сокращений среди прочего позволяет выдержать более единый стиль, Вы же (видимо) считаете необходимость изредка добавлять "лишний суффикс" удачной платой за другие преимущества. Локшин МаркА то понапишут всяких огрызков типа st.a = or.b и потом сиди разбирай какое отношение с каким связывается. Хм. Мне захотелось - по материалам далеко не только этой дискуссии - вывесить универсальный баннер: "В любой технологии и в любом подходе можно сделать плохо. Примеры этого "плохо" нисколько не доказывают, что нельзя сделать хорошо и сами по себе не являются аргументами против этой технологии. Надо как минимум показать, что "делать хорошо" - трудно". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2006, 13:11 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
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 из религиозных соображений. Я объяснил ему, что возражаю из соображений качества, которые с моей точки зрения к религиозным не относятся. Не относятся - потому что трудноформализуемы, но тем не менее косвенно измеримы. Прошу прощения, сейчас мне пора уходить, так что на оставшуюся часть Вашего письма отвечу позже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2006, 13:41 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
softwarer Преимущество запятых в том, что не потребуется заглядывать на пару страниц вниз, дабы определить, используется ли поле "b" во втором подзапросе и соответственно нужно ли переименовывать его в "b1" в первом. Преимущество запятых в том, что если сделать в этой операции ошибку, запрос может быть станет выдавать ошибку (что терпимо), но не станет молча выдавать некорректных данных (что недопустимо). vadiminfoБольшую осмысленность - соединения явно прописано, Хм. То есть встретив natural join, мне нужно отмотать на страницу вверх и посмотреть на тридцать полей в верхнем подзапросе, специально запомнив те из них, которые имеют алиасы, предотвращающие излишнее соединение (например, поля PRICE, QUANTITY, DATE_ACTIVE и так далее). Затем отмотать на страницу вниз и повторить операцию. Далее сопоставить два списка и вычислить из них результат. Простите, но я таки не вижу в этом осмысленности. Предлагаю считать вопросом религии. vadiminfoЕсли бы в первом примере вы добавили b с целю соединения, То мне в любом случае пришлось бы тщательно проверить новый запрос - выдает ли он нужные данные - и заново его оптимизировать. Необходимость написать несколько лишних букв и явно указать желаемое, так, чтобы сопровождающим не пришлось мучительно вычислять, что я имел в виду, на этом фоне выглядит "о очень малым". 2 softwarer Гм, а можно несколько offtop - вопрос: поддается ли все это автоматизации? Т.е. к примеру, для каждого SQL запроса хранить результаты анализа - откуда какие поля, как какие таблицы соединены при данном виде запроса и текущем состоянии схемы БД. А при каждом изменении структуры таблиц - автоматически проводить повторный анализ этих запросов и сравнение, с генерацией предупреждений об изменении условий соединений и т.п.? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2006, 13:55 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
-------------поддается ли все это автоматизации? Т.е. к примеру, ...... В принципе можно. Теоретических препятствий вроде бы нет, но практических уйма - например, надо будет каким-то образом отлавливать изменение запроса в клиенте, причем понимать, что это именно изменение запроса, а не новый запрос, похожий на старый. Главное - я не вижу практического смысла в такой автоматизации; по крайней мере овчинка явно не стоит выделки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2006, 13:18 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
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Вы все-таки сторнник крайностей - раз не удается полностью все делать в соотвествии со, то откажемся от них ваще? Я полагаю, что нельзя быть немножко беременной. Полное соблюдение стандарта - дает некоторые преимущества (пусть, с моей точки зрения в общем случае не перекрывающие недостатков, но дает). Неполное соблюдение стандартов означает: и преимуществ нет, и недостатки тупо соблюдаются. Вывод? Для меня вывод - делать хорошо. И если, совершенно случайно, это "хорошо" совпадет с неким стандартом - еще лучше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2006, 13:57 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
softwarer mir в своем письме сказал, что я возражаю против natural join из религиозных соображений. Я объяснил ему, что возражаю из соображений качества, которые с моей точки зрения к религиозным не относятся. Не относятся - потому что трудноформализуемы, но тем не менее косвенно измеримыНу-ну. Я не так сказал. Автоцитата: "Это что-то больше психологическое, чем технологическое." То есть технологический аспект данного вопроса я признаю, но считаю его малосущественным по сравнению с огромным количество других, гораздо более важных технологических проблем SQL-программирования, среди коих создание стандарта именования объектов БД, стандарта оформления (форматирования) скриптов и т.д. В этой связи вопрос "как писать JOIN" выглядит мелко для столь категоричных заявлений, как ваше. А поскольку достаточно веско обосновать свою точку зрения вы пока не сумели, то здесь для меня показалось очевидным сильное влияние психологического аспекта, а именно силы привычки, либо воспринятое на веру мнение авторитетного для вас человека. То есть ничего обидного я в виду не имел (а обвинение в религиозном фанатизме в технической сфере считаю обидным, и к вам не отношу). Поскольку вы сами сказали, что обсуждаемые материи трудноформализуемы, подходящим критерием обычно является опыт. Опыта использования NATURAL JOIN у меня нет (ну не поддерживает его SQL Server), поэтому на это тему спорить не берусь, возможно вы правы. Но прав только в том случае, если у вас у самого есть реальный опыт многочисленных шишек от NATURAL JOIN, а не просто мнение по этому вопросу. Однако по поводу использования синтаксиса INNER/OUTER JOIN во FROM опыта у меня предостаточно, и тут я могу с полным правом заявить, что никакого вреда в них окромя пользы за многие годы никогда не видел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2006, 16:56 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
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 Вывод? Для меня вывод - делать хорошо. И если, совершенно случайно, это "хорошо" совпадет с неким стандартом - еще лучше. Если бы я сделал подобный по стилю вывод, но с большим креном в пользу стандартов, Вы не вспомнили какого-нибудь своего соученика, чтобы раскритиковать меня в пух и прах? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2006, 21:47 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
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По поводу именований: я говорю, что метод сокращений среди прочего позволяет выдержать более единый стиль, Непонятно, зачем вводить еще одну систему - сокращений с полной ее реалищацией исключительно силами программиста. От чего здесь стиль будет более единый? У Вас также появятся аналоги суффиксов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2006, 21:57 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Локшин Марк 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. заменить на Код: plaintext 1. 2. 3. 4. При использовании алиасов это довольно естественно; если же везде применять имена таблиц и обозвать подзапрос именем таблицы, это здорово дезориентирует; конечно, можно привыкнуть, но не думаю, что это хорошая практика. Локшин МаркПричем сокращать ВЕЗДЕ ОДИНАКОВО, иначе у Вас это извините не технология, а форменный бардак будет? Думаю, у нас разное понимание ВЕЗДЕ ОДИНАКОВО. Для меня это - используя одинаковую и достаточно прозрачную логику. Для Вас, подозреваю - нечто другое. Локшин МаркНепонятно, зачем вводить еще одну систему - сокращений с полной ее реалищацией исключительно силами программиста. От чего здесь стиль будет более единый? У Вас также появятся аналоги суффиксов. Хм. Вы пытаетесь посмотреть сквозь шоры своей системы. В ней, безусловно, придется делать именно суффиксы. Лично я запрос Код: plaintext 1. 2. 3. полагаю более "единостильным", нежели Код: plaintext 1. 2. 3. 4. и суффиксы вижу только во втором варианте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2006, 13:32 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
mirНу-ну. Именно что. mirЯ не так сказал. Автоцитата: "Это что-то больше психологическое, чем технологическое." Не спорю. Согласны ли Вы с произведенной мной заменой психологического на религиозное (с учетом того смысла, который придан второму термину в дальнейшем обсуждении), или считаете это неправомерным? mirТо есть технологический аспект данного вопроса я признаю, Но считаете его несущественным (малосущественным), о чем дальше и говорите. Далее идет стандартный математический (и не только) прием - отбрасывание несущественных слагаемых. Далее я не говорю ничего, что делало бы такое отбрасывание некорректным - я говорю об общем смысле Вашего письма ("главным образом нетехнологическое") и противопоставляю ему общий смысл своего письма ("главным образом технологическое"). Если Вы не согласны с этим - прошу объяснить. mirно считаю его малосущественным по сравнению с огромным количество других, гораздо более важных технологических проблем Если не ошибаюсь, мы нигде в этом топике на момент Вашего письма не обсуждали другие проблемы, в том числе более важные, поэтому у Вас нет возможности отнормировать мое отношение к этой проблеме к отношению к каким-то другим. Соответственно, Вы не можете делать выводов из величины этого отношения. mirВ этой связи вопрос "как писать JOIN" выглядит мелко для столь категоричных заявлений, как ваше. Хм. То есть, если Вы видите, что программист-новичок делает мелкую в принципе ошибку, например отсутствие проверки на маловероятную некорректную ситуацию, Вы ни в какой ситуации не станете категорично настаивать на ее исправлении? То есть если он упрется рогом и скажет "не буду делать и все", Вы скажете "ладно, бог с тобой"? Почему я задаю этот вопрос. Если Вы допускаете возможность категоричности в этом случае - разваливается Ваша логика связывания величины ошибки с категоричностью подхода "ошибки надо исправлять". Если же действительно в такой ситуации спустите на тормозах - это будет просто интересным для меня результатом. В таком случае мне придется констатировать, что Вы согласны получить в итоге не столь качественный продукт [как тот, каким он легко мог бы стать]. Я придерживаюсь иной точки зрения, причем не скрываю, что в этом вопросе весьма категоричен. mirА поскольку достаточно веско обосновать свою точку зрения вы пока не сумели, Хм. Если не против, давайте остановимся на этом моменте. К тому моменту, когда Вы написали свою фразу, я ее вообще не обосновывал. Я сказал саму фразу, vadiminfo на нее ответил, и как я собственно и предлагал - "полагаю, можно ставить точку" - на этом эта ветка и заглохла. Далее мы немного поговорили с Марком, и далее Вы написали в том числе и обсуждаемую сейчас фразу. Поэтому, простите, я бы хотел придраться к Вашей передаче событий :) mirто здесь для меня показалось очевидным сильное влияние психологического аспекта, а именно силы привычки, либо воспринятое на веру мнение авторитетного для вас человека. То есть ничего обидного я в виду не имел Хм. Если обратите внимание, я нисколько не обиделся, но в ответном письме к Вам просто прояснил, какие соображения я считаю основными. Мало того, я считаю глупой саму мысль обидеться на "кто-то что-то обо мне подумал, и хуже того, высказал". mir(а обвинение в религиозном фанатизме в технической сфере считаю обидным, и к вам не отношу). Тут следует учесть, что в дальнейшем обсуждении это слово использовалось в переносном смысле, и в моей фразе было употреблено именно в нем же. mirпоэтому на это тему спорить не берусь, возможно вы правы. Но прав только в том случае, если у вас у самого есть реальный опыт многочисленных шишек от NATURAL JOIN, а не просто мнение по этому вопросу. Нет, по этому поводу у меня именно мнение. Основанное, разумеется, на шишках от каких-то других ситуаций, которые я полагаю сходными. Разумеется, прямых аналогий нет, но думаю Вы согласитесь - определенный опыт в "самом разном программировании" позволяет сформировать некие достаточно абстрактные критерии (на уровне универсальности "давать хорошие имена переменным, таблицам....."). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2006, 14:17 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
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 я не думал, какое исходное отношение в БД было переименовано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2006, 13:23 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Локшин МаркСправедливости ради нужно отметить, что деление на 0 на расширенном множестве действительных чисел определяют и как неопределенность для любого числа в числителе.Вы бы все-таки почитали более серьезную математическую литературу, прежде чем вот так просто начинать на ноль делить. Ну или хотя бы в википедию сходили. В кратце можно сформулировать так - для того, чтобы избежать неопределенности с делением на ноль вы безумно усложнили всю аксиоматику. До этого аксиоматизирована было всего одина неопределенность. А в вашем же расширенном множестве (кстати а не потрудитесь ли полноценно сформулировать?) таких аксиоматизированных неопределенностей просто море. В некоторых серьезных математических теориях действительно расширяют множество "бесконечными элементами", но эти конструкции уже достаточно сложны и используются отнюдь не для того, чтобы "можно было делить на ноль". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2011, 10:29 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Вы бы все-таки почитали более серьезную математическую литературуВы бы все-таки посмотрели на дату топика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2011, 11:47 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
LSVВы бы все-таки посмотрели на дату топика. На дату я действительно не посмотрел - из-за глюка форума сообщение было помечено у меня как новое. Соответственно к нему я ответ и написал. Ну а когда дату увидел - удалить сообщение было уже нельзя, а модераторы этого делать, видимо, не будут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2011, 13:34 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Ну, учитывая, что модераторы таки удалили сообщение, которое подняло топик (и пометило его новым для Андрея) может и удалят. Или продолжим сраконструктивную дискуссию? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2011, 14:07 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Bogdanov AndreyЛокшин МаркСправедливости ради нужно отметить, что деление на 0 на расширенном множестве действительных чисел определяют и как неопределенность для любого числа в числителе.Вы бы все-таки почитали более серьезную математическую литературу, прежде чем вот так просто начинать на ноль делить. Ну или хотя бы в википедию сходили. В кратце можно сформулировать так - для того, чтобы избежать неопределенности с делением на ноль вы безумно усложнили всю аксиоматику. До этого аксиоматизирована было всего одина неопределенность. А в вашем же расширенном множестве (кстати а не потрудитесь ли полноценно сформулировать?) таких аксиоматизированных неопределенностей просто море. В некоторых серьезных математических теориях действительно расширяют множество "бесконечными элементами", но эти конструкции уже достаточно сложны и используются отнюдь не для того, чтобы "можно было делить на ноль". Да, давно дело было... Вы не поверите, но я в своей жизни достаточно много читал серьезной математической литературы. Вот вам еще ссылка . Наверное несерьезная фирма Wolfram? Кроме тех, которых я давал насчет определений деления в Яве и в сопроцессоре Intel. Ну и здесь наверное идиоты сидят? И множество это расширенное не мое, я на авторство не претендую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2012, 12:02 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Локшин МаркДа, давно дело было... Но вам таки нетерпится ответить... Локшин МаркВы не поверите, но я в своей жизни достаточно много читал серьезной математической литературы.Действительно - не верю. Локшин МаркИ множество это расширенное не мое, я на авторство не претендую.Ну так все-таки определение "расширенного множества" вы приведете? Мне авторство не важно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2012, 17:06 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Bogdanov AndreyЛокшин МаркВы не поверите, но я в своей жизни достаточно много читал серьезной математической литературы.Действительно - не верю. Локшин МаркИ множество это расширенное не мое, я на авторство не претендую.Ну так все-таки определение "расширенного множества" вы приведете? Мне авторство не важно. Можете и не верить - я никого не заставляю. А ссылку на определение я уже приводил - смотрите например 2 ссылку в моем сообщении на которое отвечали изначально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2012, 17:36 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
И кстати, если уж хочется подискутировать, то потрудитесь сперва ответить, почему во всех вышеназванных местах результат деления - бесконечность? И кто в Intel и Wolfram не читал серьезную математическую литературу? Значит можно и так и так определять? Или это неверно, потому, что в Демидовиче не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2012, 17:54 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Bogdanov Andrey, Кстати, Вы бы свою же ссылочку на википедию до конца прочитали бы сперва, прежде чем сомневаться в том чего я читал, а чего не читал... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2012, 18:10 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Локшин МаркА ссылку на определение я уже приводил - смотрите например 2 ссылку в моем сообщении на которое отвечали изначально.Это вы мне спецификацию языка Java в качестве математиеского определения приводите? Спасибо, насмешили. Вот как только вы мне сможете нормальную алгебраическую структуру описать в которой деление на нуль определено, тогда и продолжим беседу. Локшин МаркКстати, Вы бы свою же ссылочку на википедию до конца прочитали бы сперва, прежде чем сомневаться в том чего я читал, а чего не читал...Я то как раз дочитал. И там четко сказано, что "деление на число 0 запрещено". А для особо непонятливых обясняют, что "a:0=бесконечность" означает ни что иное как запись предельного отношения, а никак не деления двух чисел. Но вы видимо этого не поняли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2012, 20:35 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Bogdanov AndreyЛокшин МаркА ссылку на определение я уже приводил - смотрите например 2 ссылку в моем сообщении на которое отвечали изначально.Это вы мне спецификацию языка Java в качестве математиеского определения приводите? Спасибо, насмешили. Вот как только вы мне сможете нормальную алгебраическую структуру описать в которой деление на нуль определено, тогда и продолжим беседу. Далеко не только Java. Что такого данное описание операции деления делает с вещественными числами, что оно становится ненормальной алгебраической структурой? Когда это покажете, тогда и продолжим беседу. Bogdanov AndreyЛокшин МаркКстати, Вы бы свою же ссылочку на википедию до конца прочитали бы сперва, прежде чем сомневаться в том чего я читал, а чего не читал...Я то как раз дочитал. И там четко сказано, что "деление на число 0 запрещено". А для особо непонятливых обясняют, что "a:0=бесконечность" означает ни что иное как запись предельного отношения, а никак не деления двух чисел. Но вы видимо этого не поняли. ВикипедияОперации деления ненулевого числа на ноль не соответствует никакое действительное число. Результат этой операции считается бесконечно большим и равным бесконечности: Ну и чем эти слова противоречат тому, что я сказал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2012, 22:41 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Локшин МаркЧто такого данное описание операции деления детлает с вещественными числами, что оно становится ненормальной алгебраической структурой?Слив засчитан. Вы сначала опишите хоть что-нибудь, а потом я вам расскажу что в вашем описании ненормально. А пока кроме фразы "деление на ноль равно бесконечности" вы вообще ничего не описали. Что такое ваша бесконечность? Какими свойствами она обладает? Как в других операциях участвует? Пока вы не сделали своего гениального открытия никакой бесконечности в множестве действительных числел не было. Вы ее придумали, вот и потрудитесь ее свойства описать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2012, 10:23 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Bogdanov AndreyЛокшин МаркЧто такого данное описание операции деления детлает с вещественными числами, что оно становится ненормальной алгебраической структурой?Слив засчитан. Вы сначала опишите хоть что-нибудь, а потом я вам расскажу что в вашем описании ненормально. А пока кроме фразы "деление на ноль равно бесконечности" вы вообще ничего не описали. Что такое ваша бесконечность? Какими свойствами она обладает? Как в других операциях участвует? Пока вы не сделали своего гениального открытия никакой бесконечности в множестве действительных числел не было. Вы ее придумали, вот и потрудитесь ее свойства описать. Я не виноват, если написано одно, а человек читает абсолютно другое. В множестве действительных чисел никакой бесконечности нет, и я обратного нигде не писал. Но R^1 можно расширить либо 2-мя элементами +\infty и -\infty либо просто \infty. Соответственно определяются операции с данными элементами. Уже R^2 можно расширить только \infty. О чем я уже упоминал 6 лет назад. Вот ссылка на так любимую вами Википедию. Ну как видно из всего того, что Вы излагаете выше, этот материал Вам не знаком... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2012, 10:41 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Локшин МаркЯ не виноват, если написано одно, а человек читает абсолютно другое. В множестве действительных чисел никакой бесконечности нет, и я обратного нигде не писал. Но R^1 можно расширить либо 2-мя элементами +\infty и -\infty либо просто \infty. Соответственно определяются операции с данными элементами. Уже R^2 можно расширить только \infty. О чем я уже упоминал 6 лет назад. Вот ссылка на так любимую вами Википедию. Ну как видно из всего того, что Вы излагаете выше, этот материал Вам не знаком...Так вы про множество действительных чисел говорите или про алгебраическую структуру (поле действительных чисел)? Или вы разницы между этими вещами не понимаете? Множество (и топологическое пространство) расширить бесконечностью можно, а вот с алгеброй там не очень. И заметьте в приведенной вами ссылке дано топологическое определение бесконечности, которе никакого отношения к делению не имеет. А фраза "Соответственно определяются операции с данными элементами" в вашем сообщении просто ложь. Так как никакого определения операций вы предоставить не соизволили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2012, 11:01 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Bogdanov AndreyТак вы про множество действительных чисел говорите или про алгебраическую структуру (поле действительных чисел)? Или вы разницы между этими вещами не понимаете? Множество (и топологическое пространство) расширить бесконечностью можно, а вот с алгеброй там не очень. И заметьте в приведенной вами ссылке дано топологическое определение бесконечности, которе никакого отношения к делению не имеет. Что-то Вы очень много придумываете, а потом свои домыслы выдаете за мои высказывания. К томуже прочитайте раздел мотивировка в той же ссылке. Bogdanov AndreyА фраза "Соответственно определяются операции с данными элементами" в вашем сообщении просто ложь. Так как никакого определения операций вы предоставить не соизволили. Ложь? Читай 20 страницу. Я бы не сказал, что это самое удачное, но это в качестве примера. За другой литературой - ходи в библиотеку уж сам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2012, 11:23 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Локшин МаркЛожь? Читай 20 страницу. Я бы не сказал, что это самое удачное, но это в качестве примера.Ну наконец-то. Хоть в чем-то топик оказался полезным - вы таки соизволили найти определения операций для работы с бесконечностью. Теперь о том, что плохо. Во первых, вместо одной неопределенности с делением на ноль пришлось узаконить кучу других (о чем я и писал с самого начала). То есть пятаясь доказать, что операция деления не приводит к неоднозначностям (а именно с этого все началось) вы ввели кучу других неоднозначностей (с делением при этом так и не разобрались). Во-вторых, потеряны многие алгебраические свойства, которые были у поля рациональных чисел. Например, в поле для любого элемента есть обратный относительно сложения. Для ваших новых элементов обратных нет. Также наюблюдаются проблемы с дистрибутивностью. Например, в выражении (1-2)/0 скобки почему-то раскрыть нельзя. То есть нормальной алгебраической структурой ваше "расширенное множество" не является. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2012, 12:52 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Bogdanov AndreyЛокшин МаркЛожь? Читай 20 страницу. Я бы не сказал, что это самое удачное, но это в качестве примера.Ну наконец-то. Хоть в чем-то топик оказался полезным - вы таки соизволили найти определения операций для работы с бесконечностью. А по-моему я здесь никому ничего не обязан. Не так ли? Bogdanov AndreyВо первых, вместо одной неопределенности с делением на ноль пришлось узаконить кучу других (о чем я и писал с самого начала). То есть пятаясь доказать, что операция деления не приводит к неоднозначностям (а именно с этого все началось) вы ввели кучу других неоднозначностей (с делением при этом так и не разобрались). Во-вторых, потеряны многие алгебраические свойства, которые были у поля рациональных чисел. Например, в поле для любого элемента есть обратный относительно сложения. Для ваших новых элементов обратных нет. Также наюблюдаются проблемы с дистрибутивностью. Например, в выражении (1-2)/0 скобки почему-то раскрыть нельзя. То есть нормальной алгебраической структурой ваше "расширенное множество" не является. Еще раз - это не мое расширенное множество, на авторство я не претендую. То что бесконечность - особый элемент я писал еще 6 лет назад. Вы теперь в небольших вариациях с умным видом это повторяете, попутно обвиняя меня в том, что я в этом не разбираюсь. Да, и где там с делением не разобрались? Так чей слив засчитывать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2012, 13:34 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Локшин МаркДа, и где там с делением не разобрались? А вы свою ссылку читали? Там четко написано, что и после введения бесконечностей выражения 0/0 и бесконечность/бесконечность неопределены. Локшин МаркЕще раз - это не мое расширенное множество, на авторство я не претендую.Но именно вы, не разобравшись в сути этого расширенного множества, решили использовать его в качестве примера для своих утверждений. Да еще и выдали "расширенное мнажество" за нечто общепринятое и общепризнанное. Я еще раз повторю, что в общем случае математика запрещает деление на ноль, а в некоторых узкоспециализированных теориях используют расширенные множества так как это позволяет упростить рассуждения. И это ни имеет никакого отношения к запугиванию детей. Еще не удалось посторить полноценную алгебраическую структуру для расширенного множества. Локшин МаркТак чей слив засчитывать?Сначала вы написали, что (цитирую): "Выражение a/b интерпретируется всегда однозначно". Потом, когда вам указали, что не все так однозначно, вы пытаясь спасти ситуацию, приплели бесконечность. Но и с бесконечностью полной однозначности не появилось. Таким образом можно констатировать, что ваши апелляции к операции деления несостоятельны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2012, 15:08 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Bogdanov AndreyА вы свою ссылку читали? Там четко написано, что и после введения бесконечностей выражения 0/0 и бесконечность/бесконечность неопределены. А, вот о чем. Ну и чему это противоречит? Где я утверждал обратное? Bogdanov AndreyНо именно вы, не разобравшись в сути этого расширенного множества, решили использовать его в качестве примера для своих утверждений. Да еще и выдали "расширенное мнажество" за нечто общепринятое и общепризнанное. Я еще раз повторю, что в общем случае математика запрещает деление на ноль, а в некоторых узкоспециализированных теориях используют расширенные множества так как это позволяет упростить рассуждения. И это ни имеет никакого отношения к запугиванию детей. Еще не удалось посторить полноценную алгебраическую структуру для расширенного множества. Я-то в отличае от некоторых во всем и давно уже разобрался. А это "расширенное мнажество", как Вы его называете есть общепринятое и общепризнанное и используется отнюдь не в "некоторых узкоспециализированных теориях" (ну кому и мат. анализ, конечно, "некоторая узкоспециализированная теория"). И то, что Вы до этого о нем не слышали не означает, что это не общепризанное. Bogdanov AndreyЛокшин МаркТак чей слив засчитывать?Сначала вы написали, что (цитирую): "Выражение a/b интерпретируется всегда однозначно". Потом, когда вам указали, что не все так однозначно, вы пытаясь спасти ситуацию, приплели бесконечность. Но и с бесконечностью полной однозначности не появилось. Таким образом можно констатировать, что ваши апелляции к операции деления несостоятельны. Нет, мне там ничего и не указали. Особенно с примером 5/0, где я, видя к чему клонит softwarer, сказал что это даже совсем и определенно (как Вы выразились приплел бесконечность). Далее по Вашему тексту - два исключения - операция 0/0 и \infty/\infty - если уж так говорить, то "неопределено" можно тоже считать результатом операции, и в результате операция определена для всех возможных значений операндов (ну вот такой результат операции - "неопределено"). Чего для операций типа *= даже и не просматривается. Так что пример явно неудачный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2012, 15:43 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Локшин Маркну вот такой результат операции - "неопределено" Лол. У вас еще один вид результатов появился? Сначала расширил множество бесконечностью, полугода не прошло, как сподобился сообщить описание операций для такого расширения. Теперь понадобился еще один элемент - "неопределено". Будете для этого элемента тоже операции описывать? А там появится еще один элемент "совсем неопределено"? А потом еще и еще... Или все-таки закончим с троллингом? У меня вопросов больше нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2012, 16:48 |
|
||
|
Разница между запятой и JOIN
|
|||
|---|---|---|---|
|
#18+
Bogdanov AndreyЛокшин Маркну вот такой результат операции - "неопределено" Лол. У вас еще один вид результатов появился? Сначала расширил множество бесконечностью, полугода не прошло, как сподобился сообщить описание операций для такого расширения. Теперь понадобился еще один элемент - "неопределено". Будете для этого элемента тоже операции описывать? А там появится еще один элемент "совсем неопределено"? А потом еще и еще... Или все-таки закончим с троллингом? У меня вопросов больше нет. Тьфу, ну сколько раз можно говорить, что не мое авторство. И насчет элемента "неопределено" - тоже. Усмехаться можете и дальше, только это идет не от понимания вопроса-то, а от его незнания. А по сути - есть операция деления, есть два операнда, для каждого операнда определено значение операции (хорошо, если не нравится значение "неопределено", то четко прописано для каких определено, а для каких - нет, т.е. в определении оговорено поведение операции для всех операндов). В отличие от *=. Где формальная процедура определения неоднозначности (аналога неопределенности для деления)? Да, это формализуемо, но будет она далеко не тривиальной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2012, 17:18 |
|
||
|
|

start [/forum/topic.php?all=1&fid=32&tid=1541836]: |
0ms |
get settings: |
8ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
47ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
282ms |
get tp. blocked users: |
2ms |
| others: | 234ms |
| total: | 614ms |

| 0 / 0 |
