Почему использование пункт СОЕДИНЕНИЯ по сравнению с, ГДЕ условие?

Я предложил бы использовать прокси Знатока как Archiva, Artifactory или Nexus и определить Ваш список repo на стороне сервера. Порядок имеет значение только до такой степени, что прокси-сервер пробует проксированный repos один за другим и определение репозитория края, поскольку сначала замедлит разрешение некэшируемых артефактов (Artifactory позволяет Вам определять белый список, и выражения черного списка для каждого проксировали repo, который решает эту проблему)

, Полное использование Вашего собственного repo дает Вам больше контроля, и надежные сборки ('центральный' является часто крайне медленным). Это также дает Вам место для помещения собственных артефактов и любых несвободных сторонних артефактов.

12
задан bignose 23 February 2019 в 05:32
поделиться

10 ответов

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

6
ответ дан 2 December 2019 в 03:10
поделиться

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

16
ответ дан 2 December 2019 в 03:10
поделиться

Самая большая проблема, с которой я столкнулся с этим форматом - это тенденция забывать предложение WHERE некоторого соединения, в результате чего получается декартово произведение. Это особенно часто (для меня по крайней мере) при добавлении новой таблицы в запрос. Например, предположим, что таблица ADDRESSES добавлена ​​в смесь, и вы немного забыли:

SELECT *
  FROM customers c, invoices i, addresses a
 WHERE c.customer_id = i.customer_id
   AND i.amount > 999.99
 ORDER BY i.amount, c.name

Бум! Декартово произведение! :)

10
ответ дан 2 December 2019 в 03:10
поделиться

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

В качестве примера:

Выберите всех клиентов и сумму продаж виджетов по всем их счетам в августе, когда счет был обработан (Invoice.ProcessDate равен Not Null)

с использованием нового синтаксиса соединения ANSI-92

 Select c.name, Sum(d.Amount)
 From customer c
    Left Join Invoice I 
        On i.custId = c.custId
            And i.SalesDate Between '8/1/2009' 
                      and '8/31/2009 23:59:59'
            And i.ProcessDate Is Not Null
    Left Join InvoiceDetails d 
        On d.InvoiceId = i.InvoiceId
            And d.Product = 'widget'
 Group By c.Name

Попробуйте сделать это со старым синтаксисом ... Поскольку при использовании синтаксиса старого стиля все условия в предложении where оцениваются / применяются ПЕРЕД «внешние» строки добавляются обратно, все строки необработанных счетов будут добавлены обратно в окончательный набор результатов ... Таким образом, это невозможно со старым синтаксисом - все, что пытается отфильтровать счета с нулевыми обработанными датами, будет устранено клиенты ... единственная альтернатива - использовать коррелированный подзапрос.

7
ответ дан 2 December 2019 в 03:10
поделиться

С тех пор я узнал, что это не стандартный синтаксис SQL.

Это не совсем так. Синтаксис «a, b where» взят из стандарта ansi-89, синтаксис «a join b on» - ansi-92. Однако синтаксис 89 является устаревшим , что означает, что вы должны не использовать его для новых запросов.

Кроме того, бывают ситуации, когда старому стилю не хватает выразительной силы, особенно с относительно внешних соединений или сложных запросов.

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

4
ответ дан 2 December 2019 в 03:10
поделиться

Это стандартный синтаксис SQL, просто более старый стандарт, чем JOIN. Есть причина, по которой синтаксис эволюционировал, и вы должны использовать новый синтаксис JOIN, потому что:

  1. Он более выразительный, четко указывает, какие таблицы объединены, порядок JOIN, какие условия применяются к какому JOIN, и отделяет условия фильтрации WHERE из условий JOIN.

  2. Он поддерживает LEFT, RIGHT и FULL OUTER JOIN, чего нет в синтаксисе WHERE.

Я не думаю, что вы найдете JOIN типа WHERE существенно менее переносимым, чем синтаксис JOIN .

3
ответ дан 2 December 2019 в 03:10
поделиться

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

Я нашел эту цитату - СкоттЧер, я полностью согласен:

Я нахожу синтаксис WHERE легче читать, чем INNER JOIN - я думаю, это похоже на Vegemite. Большинство людей в мире, вероятно, находят его отвратительным, но дети, выросшие на его еде, обожают его.

3
ответ дан 2 December 2019 в 03:10
поделиться

Это действительно зависит от привычек, но я всегда находил синтаксис Oracle, разделенный запятыми, более естественным. Первая причина заключается в том, что я думаю, что использование (INNER) JOIN снижает удобочитаемость. Второй - о гибкости. В конце концов, соединение по определению является декартовым произведением. Необязательно ограничивать результаты на основе идентификаторов обеих таблиц. Декартово произведение двух таблиц может потребоваться, хотя и очень редко. Ограничение их на основе идентификаторов - вполне разумная практика, но НЕ ПРАВИЛО . Однако, если вы используете ключевое слово JOIN , например, в SQL Server, оно не позволит вам опустить ключевое слово ON . Предположим, вы хотите создать комбинированный список. Вы должны сделать это так:

SELECT *
FROM numbers
JOIN letters
ON 1=1

Кроме того, Я считаю, что синтаксис Oracle (+) также очень разумен. Это хороший способ сказать: « Добавьте и эту запись в набор результатов, даже если она пуста. « Это намного лучше, чем синтаксис RIGHT / LEFT JOIN , потому что в по факту нет ни левого, ни правого! Когда вы хотите объединить 10 таблиц с несколькими разными типами внешних объединений, возникает путаница, какая таблица находится «слева», а какая справа.

Кстати, в качестве более общего комментария, я не Я не думаю, что переносимость SQL больше существует в практическом мире. Стандартный SQL настолько плох, а выразительность разнообразного синтаксиса СУБД так часто востребована, что я не думаю, что 100% переносимый код SQL - достижимая цель. Наиболее очевидным свидетельством моих наблюдений является старый добрый номер строки проблематичный. Просто выполните поиск на любом форуме по запросу " sql row number" , включая SO, и вы увидите сотни сообщений, спрашивающих, как этого можно добиться в конкретной СУБД. Сходным и связанным с этим является ограничение количества возвращаемых строк , например ..

3
ответ дан 2 December 2019 в 03:10
поделиться

Итак ... став счастливым обладателем значка перекати-поле, я вернулся к этому, чтобы попытаться найти способ обойти это. ; -)

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

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

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

0
ответ дан 2 December 2019 в 03:10
поделиться

На самом деле этот синтаксис более переносим, ​​чем JOIN, потому что он будет работать практически с любой базой данных, в то время как не все поддерживают синтаксис JOIN (Oracle Lite не поддерживает , например [если это недавно не изменилось]).

-2
ответ дан 2 December 2019 в 03:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: