Обновление только определенных столбцов из одной таблицы в другую SQL [duplicate]

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

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

  выбрать новый {A = значение.A, B = значение.C + "_" + значение.D};   

с

  выберите новый DynamicObject (новый {A = значение.A, B = значение.C + "_" + значение.D}).  CreateDuck & л; DummyInterface & GT; ();   

375
задан linuxbuild 5 February 2011 в 12:21
поделиться

11 ответов

Вы можете сделать это одним из двух способов:

Синтаксис соединения с обновлением MySQL:

  таблица обновленийA левая таблица joinB b на a.name_a = b.name_b  set validation_check = if (start_dts & gt; end_dts, 'VALID', '') - где может быть предложение where  

Синтаксис ANSI SQL:

  update  tableA set validation_check = (SELECT if (start_DTS & gt; end_DTS, 'VALID', '') как validation_check FROM tableA LEFT JOIN tableB ON name_A = name_B WHERE id_A = tableA.id_A)  

Pick какой вам кажется наиболее естественным для вас.

624
ответ дан Joe Phillips 16 August 2018 в 01:20
поделиться
  • 1
    Первая форма (обновление с соединением) будет lot более эффективной, чем вторая. Первый будет делать одно соединение, тогда как второе будет выполнять запрос выбора для каждой строки таблицыA. – ColinM 8 November 2012 в 19:54
  • 2
    В первом примере вам не следует использовать внутреннее соединение? Не приведет ли левое объединение к тому, что validation_check будет установлено значение null для записей tableA без соответствующей записи tableB? – Cerin 25 February 2014 в 19:14
  • 3
    @Cerin да, что случилось со мной. Это должно быть внутреннее соединение! Или просто оставьте это как соединение. Если у вас нет внутреннего соединения, левое соединение означает, что все записи tableA будут обновлены! Это очень опасно! – CMCDragonkai 14 May 2015 в 14:09
  • 4
    @Eric, я становлюсь вашим поклонником для условия IF для первого запроса для обновления поля. Отлично, Еппее. – NullPointer 26 April 2016 в 18:53
  • 5
    Спасибо за первое (y). Хотя этот ответ более 7 лет. Я не могу поверить, почему никто не заявил, что второй не работает в какой-либо базе данных, такой как MySQL. Вы получите эту ошибку: Вы не можете указать целевую таблицу ___ для обновления в предложении FROM SQL.sql – Jugali Lakota 9 November 2016 в 17:20

Вы можете обновлять значения из другой таблицы, используя внутреннее объединение, как это

  UPDATE [table1_name] AS t1 INNER JOIN [table2_name] AS t2 ON t1.column1_name] = t2. [column1_name] SET  t1. [column2_name] = t2.column2_name];   

Следуйте здесь, чтобы узнать, как использовать этот запрос http://www.voidtricks.com/mysql-inner-join-update/

, или вы можете использовать select в качестве подзапроса для этого

  UPDATE [table_name] SET [имя_столбца] = (SELECT [имя_столбца] FROM [имя_таблицы] WHERE [имя_столбца] = [значение]) WHERE  [column_name] = [значение];   

подробно описан здесь http://www.voidtricks.com/mysql-update-from-select/

4
ответ дан Anand Roshan 16 August 2018 в 01:20
поделиться
  UPDATE `table1` AS` dest`, (SELECT * FROM `table2` WHERE` id` = x) AS `src` SET` dest`.`col1` = `src`.`col1` WHERE  `dest`.`id` = x;   

Надеюсь, это сработает для вас.

226
ответ дан automatix 16 August 2018 в 01:20
поделиться
  • 1
    Это самый быстрый запрос. Изменить: имея dest с 22K строками и src с 4K строк, потребовалось менее 1 секунды, в то время как верхний ответ за 60 секунд. – Chris Dev 19 June 2017 в 15:06
  • 2
    Да, это самый быстрый запрос, BTW вы можете добавить предложение WHERE – robinmag 28 June 2017 в 18:19
  UPDATE [table_name] AS T1, (SELECT [имя_столбца] FROM [имя_таблицы] WHERE [имя_столбца] = [значение]) AS T2 SET T1. [column_name] = T2. [column_name] + 1 WHERE T1.  [column_name] = [значение];   
4
ответ дан bhavik 16 August 2018 в 01:20
поделиться
  UPDATE receipt_invoices dest, (SELECT `receipt_id`, CAST ((net * 100) / 112 AS DECIMAL (11, 2)) witoutvat FROM receipt WHERE CAST ((net * 100) / 112 AS DECIMAL (11  , 2))! = Total AND vat_percentage = 12) src SET dest.price = src.witoutvat, dest.amount = src.witoutvat WHERE col_tobefixed = 1 И dest.`receipt_id` = src.receipt_id;   

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

9
ответ дан Don 16 August 2018 в 01:20
поделиться

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

Этот код лучше и чист для всех уровней: [ ! d2]

  update dbname1.content targetTable left join dbname2.someothertable sourceTable at targetTable.compare_field = sourceTable.compare_field set targetTable.col1 = sourceTable.cola, targetTable.col2 = sourceTable.colb, targetTable.col3 = sourceTable  .colc, targetTable.col4 = sourceTable.cold  

Traaa! Он отлично работает!

С учетом вышеизложенного вы можете изменить заданные поля и критерии «on», чтобы выполнить свою работу. Вы также можете выполнить проверки, затем потянуть данные в таблицу temp, а затем запустить обновление, используя приведенный выше синтаксис, заменив имена таблиц и столбцов.

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

43
ответ дан KMX 16 August 2018 в 01:20
поделиться

Легко в MySQL:

  Пользователи UPDATE AS U1, пользователи AS U2 SET U1.name_one = U2.name_colX WHERE U2.user_id = U1.user_id  
74
ответ дан Lucky 16 August 2018 в 01:20
поделиться

У меня была проблема с дублирующимися записями в одной таблице. Ниже приведены подходы к работе.

Наконец, я решил это, используя следующие запросы:

  1. Запрос выбора сохраняется в таблице temp IF OBJECT_ID ( N'tempdb .. # New_format_donor_temp ', N'U') НЕ ТАБЛИЦА NULL DROP #New_format_donor_temp; выберите * в #New_format_donor_temp из DONOR_EMPLOYMENTS, где DONOR_ID IN (1, 2) - Test New_format_donor_temp - SELECT * - FROM #New_format_donor_temp;
  2. Таблица temp объединяется в запрос обновления. UPDATE de SET STATUS_CD = de_new.STATUS_CD, STATUS_REASON_CD = de_new.STATUS_REASON_CD, TYPE_CD = de_new.TYPE_CD FROM DONOR_EMPLOYMENTS КАК ИННЕРНАЯ ПРИСОЕДИНЯЯСЬ #New_format_donor_temp AS de_new ON de_new.EMP_NO = de.EMP_NO WHERE de.DONOR_ID IN (3, 4 )

Я не очень разбираюсь в SQL, пожалуйста, сообщите нам какой-нибудь лучший подход.

Выше запросы для сервера MySql.

0
ответ дан Rick 16 August 2018 в 01:20
поделиться

Вы можете использовать:

  UPDATE Станция AS st1, StationOld AS st2 SET st1.already_used = 1 WHERE st1.code = st2.code  
2
ответ дан SergeyUr 16 August 2018 в 01:20
поделиться

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

Мне нужно заполнить поле product_id в таблице действий, где действия нумеруются в единице, а единицы нумеруются на уровне (идентифицированном с использованием строки N), так что можно определить действия используя SKU, т.е. L1U1A1. Затем эти SKU хранятся в другой таблице.

Я определил следующее, чтобы получить список activity_id vs product_id: -

  SELECT a.activity_id, w.product_id FROM activity a JOIN units USING (unit_id) JOIN product_types  ИСПОЛЬЗОВАНИЕ (product_type_id) JOIN web_products w ON sku = CONCAT ('L', SUBSTR (product_type_code, 3), 'U', unit_index, 'A', activity_index)  

Я обнаружил, что это был слишком сложным для включения в SELECT в mysql, поэтому я создал временную таблицу и присоединился к ней с помощью инструкции update: -

  CREATE TEMPORARY TABLE activity_product_ids AS (& lt; вышеуказанный оператор select & gt;  );  Действия UPDATE: JOIN activity_product_ids b ON a.activity_id = b.activity_id SET a.product_id = b.product_id;   

Я надеюсь, что кто-то найдет это полезное

9
ответ дан sibaz 16 August 2018 в 01:20
поделиться

Для этой же таблицы

  UPDATE PHA_BILL_SEGMENT AS PHA (SELECT BILL_ID, COUNT (REGISTRATION_NUMBER) AS REG FROM PHA_BILL_SEGMENT GROUP BY REGISTRATION_NUMBER, BILL_DATE, BILL_AMOUNT ИМЕЕТ REG & gt; 1) T SET PHA  .BILL_DATE = PHA.BILL_DATE + 2 WHERE PHA.BILL_ID = T.BILL_ID;   
1
ответ дан Thomas David Baker 16 August 2018 в 01:20
поделиться
Другие вопросы по тегам:

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