SQL: Обновление при объединении, в стандартах? - PullRequest
1 голос
/ 05 октября 2009

Я знаю, что большая часть программного обеспечения сервера sql позволяет выполнять «Обновление при соединении», но мне интересно, это в стандартах SQL? (например, могу ли я предположить, что любой программный пакет позволяет это?)

Примечание. Я спрашиваю об этом, потому что пишу библиотеку базы данных, которая должна быть легко расширяемой для программного обеспечения базы данных, которое не включено в исходную сборку. Таким образом, нет смысла отвечать такими замечаниями, как «a, b, c и b все это позволяют - вместе они составляют львиную долю рынка, поэтому можно предположить, что все программные пакеты позволяют это». Нет, меня интересует, в стандартах это или нет.

Ответы [ 4 ]

4 голосов
/ 05 октября 2009

Если я правильно понял вопрос, я думаю, что ответ «нет», стандартного «обновления на основе объединения» не существует. Страница справочника postgres для UPDATE включает это в разделе «Совместимость»:

Эта команда соответствует стандарту SQL, за исключением того, что предложения FROM и RETURNING являются расширениями PostgreSQL, как и возможность использования WITH с UPDATE.

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

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

2 голосов
/ 26 января 2013

Осторожнее, ребята. Написание действительно переносимого кода гораздо сложнее, чем вы думаете, и вы также должны быть готовы отказаться от многих аспектов производительности, простоты кодирования / обслуживания и читабельности. Просто объявите и используйте одну переменную, скажем, в SQL Server, и ваш код больше не будет действительно переносимым. Напишите триггер аудита, и я могу гарантировать, что ваш триггер не будет переносимым между Oracle, SQL Server и несколькими другими популярными механизмами. И это должно действительно иметь значение, потому что это на самом деле не ракетостроение ни в одной СУБД (ну, разве что для написания объединенного ОБНОВЛЕНИЯ в Oracle без использования MERGE {который является стандартным, но пока не переносимым}).

Кроме того, не забывайте, что есть два основных типа SQL. То, что поддерживает однорядную природу большинства интерфейсного кода и пакетного кода. Если вы действительно хотите, чтобы ваш пакетный код работал хорошо, вы будете использовать многие «проприетарные расширения» для механизма базы данных, который вы используете, чтобы эффективно обрабатывать иногда миллиарды строк в одночасье ... в ту же ночь. ; -)

Будьте внимательны при написании кода для «истинной» переносимости. У вас может получиться запутанный беспорядок, который намного медленнее, чем вы могли себе представить.

2 голосов
/ 05 октября 2009

В соответствии со стандартом ANSI SQL-92, UPDATE для таблиц JOINed НЕ является частью стандартов;См. http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt разделы 13.9 и 13.10 (вам придется искать 391, номер страницы).

Я пытался найти стандарт ANSI 2003, но самое близкое, что я нашел, было здесь: www.wiscorp.com/sql_2003_standard.zip (поздняя версия).Между ними не было существенной разницы в отношении оператора UPDATE и синтаксиса JOIN.

Stu

2 голосов
/ 05 октября 2009

Вы предполагаете, что все программные пакеты соответствуют стандартам ANSI SQL ..... на самом деле, ни один из них, о которых я знаю, полностью не соответствует стандартам.

Если вы хотите придерживаться стандартов ANSI SQL, лучше всего начать с самих документированных стандартов. Вот документ SQL-92:

http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...