'Удаляют из соединения' стандарт SQL?

Если Ваши поиски на том поле всегда будут быть чувствительными к диакритическим знакам, то будут объявлять сопоставление поля как utf8_bin (то это сравнит для равенства utf8-закодированные байты), или используйте язык определенное сопоставление, которые различают и безударные символы с диакритическим знаком.

col_name varchar(10) collate utf8_bin

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

WHERE col_name = 'abád' collate utf8_bin
7
задан Community 23 May 2017 в 10:27
поделиться

5 ответов

УДАЛИТЬ ... ИЗ .. Не является частью стандартов ANSI, ни ОБНОВЛЕНИЕ ... ОТ ... в этом отношении. Это включает в себя любой синтаксис соединения, поскольку соединение может быть указано только с помощью FROM.

Все поставщики реализуют это, хотя в той или иной форме.

5
ответ дан 6 December 2019 в 07:06
поделиться

The last time I looked at the ANSI standard, the preferred method was subqueries and not JOINs. When dealing with only one implementation, where porting your code is not an issue, then you can use vendor-specific extensions freely, when they are more efficient (though UPDATE FROM, and I imagine DELETE FROM in some scenarios, has proven unpredictable: https://sqlserverfast.com/blog/hugo/2008/03/lets-deprecate-update-from/). Personally, I typically use CTEs for a lot of DELETE operations... but my development is restricted to SQL Server and I don't have to worry much about portability at all. MERGE can also be a good choice when you are performing multiple DML operations, but again this is not implemented the same (or at all) across all vendors.

In your case, I would say stay away from DELETE FROM ... JOIN because the syntax will vary slightly on the three platforms. If you use stored procedures this is less of an issue than if the SQL is embedded in your application(s), but still a hassle nonetheless.

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

Я использовал подобные запросы, когда работал на сервере MS SQL. Не уверен насчет остальных.

0
ответ дан 6 December 2019 в 07:06
поделиться

Не соответствует Международному стандарту ISO / IEC 9075: 1992 Раздел 13.6, страницы 384-386. Синтаксис удаления с помощью JOIN не работает в Oracle.

9
ответ дан 6 December 2019 в 07:06
поделиться

это действительно будет работать в Oracle. Ключевое слово FROM является необязательным: DELETE (запрос) то же самое, что DELETE FROM (запрос) .

Правила для УДАЛЕНИЯ СОЕДИНЕНИЯ такие же, как правила для обновления ПРИСОЕДИНИТЬСЯ: Oracle будет изменять строки только из одной таблицы и только в том случае, если нет двусмысленности в идентификации строк базовой таблицы. Посмотрите, например, в этот SO или этот SO .

Давайте построим небольшой пример:

CREATE TABLE t_parent (ID NUMBER PRIMARY KEY, NAME VARCHAR2(10));
CREATE TABLE t_child (ID NUMBER PRIMARY KEY, 
                      parent_id NUMBER REFERENCES t_parent);
INSERT INTO t_parent VALUES (1, 'a');
INSERT INTO t_child VALUES (1, 1);
INSERT INTO t_child VALUES (2, 1);

Вы можете удалить строки из таблицы CHILD:

SQL> DELETE FROM (SELECT t_child.*
  2                 FROM t_child
  3                 JOIN t_parent ON t_parent.id = t_child.parent_id
  4                WHERE t_parent.name = 'a');

2 rows deleted
6
ответ дан 6 December 2019 в 07:06
поделиться
Другие вопросы по тегам:

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