Как я могу сделать оператор UPDATE с JOIN в SQL?

Это работает только для чисел, меньших 1.

select to_char(12.34, '0D99') from dual;
-- Result: #####

Это не сработает.

Вы можете сделать что-то подобное, но это приводит к ведущим пробелам:

select to_char(12.34, '999990D99') from dual;
-- Result: '     12,34'

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

select trim(to_char(12.34, '999990D99')) from dual;
-- Result: 12,34

Опять же, это будет только для чисел с максимальным числом в 6 цифр.

Редактирование: я хотел добавить это как комментарий к предложению DCookie, но я не могу.

1231
задан Ronan Boiteau 25 September 2018 в 15:56
поделиться

4 ответа

Синтаксис строго зависит от того, какую СУБД SQL вы используете. Вот несколько способов сделать это в ANSI / ISO (он же должен работать с любой СУБД SQL), MySQL, SQL Server и Oracle. Имейте в виду, что предлагаемый мной метод ANSI / ISO обычно будет намного медленнее, чем два других метода, но если вы используете СУБД SQL, отличную от MySQL, SQL Server или Oracle, тогда это может быть единственный способ (например, если ваша СУБД SQL не поддерживает MERGE ):

ANSI / ISO:

update ud 
     set assid = (
          select sale.assid 
          from sale 
          where sale.udid = ud.id
     )
 where exists (
      select * 
      from sale 
      where sale.udid = ud.id
 );

MySQL:

update ud u
inner join sale s on
    u.id = s.udid
set u.assid = s.assid

SQL Server:

update u
set u.assid = s.assid
from ud u
    inner join sale s on
        u.id = s.udid

PostgreSQL:

update ud
  set ud.assid = s.assid
from sale s 
where ud.id = s.udid;

Обратите внимание, что целевая таблица не должна повторяется в предложении FROM для Postgres.

Oracle:

update
    (select
        u.assid as new_assid,
        s.assid as old_assid
    from ud u
        inner join sale s on
            u.id = s.udid) up
set up.new_assid = up.old_assid

SQLite:

update ud 
     set assid = (
          select sale.assid 
          from sale 
          where sale.udid = ud.id
     )
 where RowID in (
      select RowID 
      from ud 
      where sale.udid = ud.id
 );
2309
ответ дан 19 December 2019 в 20:16
поделиться

Стандартный подход SQL был бы

UPDATE ud
SET assid = (SELECT assid FROM sale s WHERE ud.id=s.id)

На SQL Server вы можете использовать соединение

UPDATE ud
SET assid = s.assid
FROM ud u
JOIN sale s ON u.id=s.id
47
ответ дан 19 December 2019 в 20:16
поделиться

Это должно работать в SQL Server:

update ud 
set assid = sale.assid
from sale
where sale.udid = id
139
ответ дан 19 December 2019 в 20:16
поделиться

Еще один пример того, почему SQL не совсем переносим.

Для MySQL это будет:

update ud, sale
set ud.assid = sale.assid
where sale.udid = ud.id;

Для получения дополнительной информации прочтите обновление нескольких таблиц: http://dev.mysql.com/doc/refman/5.0/en/update.html

UPDATE [LOW_PRIORITY] [IGNORE] table_references
    SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
    [WHERE where_condition]
15
ответ дан 19 December 2019 в 20:16
поделиться
Другие вопросы по тегам:

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