MySQL - Запрос UPDATE на основе запроса SELECT

Мне нужно проверить (из той же таблицы), есть ли связь между двумя событиями на основе даты-времени.

Один набор данных будет содержать время окончания определенных событий, а другой набор данных будет содержать время начала других событий.

Если первое событие завершается раньше второго, то я хотел бы связать их.

На данный момент у меня есть следующие данные:

SELECT name as name_A, date-time as end_DTS, id as id_A 
FROM tableA WHERE criteria = 1

SELECT name as name_B, date-time as start_DTS, id as id_B 
FROM tableA WHERE criteria = 2

Затем я присоединяюсь к ним:

SELECT name_A, name_B, id_A, id_B, 
if(start_DTS > end_DTS,'VALID','') as validation_check
FROM tableA
LEFT JOIN tableB ON name_A = name_B

Могу ли я затем, основываясь на поле validation_check, выполнить запрос UPDATE с вложенным SELECT?

Комментарии к вопросу (1)
Решение

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

Синтаксис MySQL update join:

UPDATE tableA a
INNER JOIN tableB b ON a.name_a = b.name_b
SET validation_check = if(start_dts > end_dts, 'VALID', '')
-- where clause can go here

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

UPDATE tableA SET validation_check = 
    (SELECT if(start_DTS > end_DTS, 'VALID', '') AS validation_check
        FROM tableA
        INNER JOIN tableB ON name_A = name_B
        WHERE id_A = tableA.id_A)

Выберите тот, который кажется вам наиболее естественным.

Комментарии (8)
UPDATE
    `table1` AS `dest`,
    (
        SELECT
            *
        FROM
            `table2`
        WHERE
            `id` = x
    ) AS `src`
SET
    `dest`.`col1` = `src`.`col1`
WHERE
    `dest`.`id` = x
;

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

Комментарии (3)

Просто в MySQL:

UPDATE users AS U1, users AS U2 
SET U1.name_one = U2.name_colX
WHERE U2.user_id = U1.user_id
Комментарии (0)

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

Этот критерий лучше и чище для всех уровней:

UPDATE dbname1.content targetTable

LEFT JOIN dbname2.someothertable sourceTable ON
    targetTable.compare_field= sourceTable.compare_field
SET
    targetTable.col1  = sourceTable.cola,
    targetTable.col2 = sourceTable.colb, 
    targetTable.col3 = sourceTable.colc, 
    targetTable.col4 = sourceTable.cold 

Трааа! Работает отлично!

Понимая вышеизложенное, вы можете изменить критерии set fields и "on" для выполнения своей работы. Вы также можете выполнить проверку, затем вытащить данные во временную таблицу (таблицы), а затем запустить обновление, используя приведенный выше синтаксис, заменив имена таблиц и столбцов.

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

Комментарии (0)
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 
  AND dest.`receipt_id` = src.receipt_id ;

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

Комментарии (0)

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

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

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

SELECT a.activity_id, w.product_id 
  FROM activities a 
  JOIN units USING(unit_id) 
  JOIN product_types USING(product_type_id) 
  JOIN web_products w 
    ON sku=CONCAT('L',SUBSTR(product_type_code,3), 'U',unit_index, 'A',activity_index)

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

CREATE TEMPORARY TABLE activity_product_ids AS ();

UPDATE activities a
  JOIN activity_product_ids b
    ON a.activity_id=b.activity_id 
  SET a.product_id=b.product_id;

Я надеюсь, что кто-то находит это полезным

Комментарии (1)
UPDATE [table_name] AS T1,
      (SELECT [column_name] 
        FROM [table_name] 
        WHERE [column_name] = [value]) AS T2 
  SET T1.[column_name]=T2.[column_name] + 1
WHERE T1.[column_name] = [value];
Комментарии (0)

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

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/

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

UPDATE [table_name] SET [column_name] = (SELECT [column_name] FROM [table_name] WHERE [column_name] = [value]) WHERE [column_name] = [value];

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

Комментарии (0)

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

UPDATE Station AS st1, StationOld AS st2
   SET st1.already_used = 1
 WHERE st1.code = st2.code
Комментарии (0)

За одним столом,

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
        HAVING REG > 1) T
    SET PHA.BILL_DATE = PHA.BILL_DATE + 2
 WHERE PHA.BILL_ID = T.BILL_ID;
Комментарии (0)

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

Наконец я решил использовать ниже запроса:

  1. Выберите запрос сохраняется во временной таблице

Если аргумент object_id(Н'базы данных tempdb..#New_format_donor_temp', Н'у') не является нулем Падение таблица № New_format_donor_temp;

выберите * в #New_format_donor_temp из DONOR_EMPLOYMENTS где DONOR_ID в ( 1, 2 )

  • Проверить New_format_donor_temp -- Выберите * -- От #New_format_donor_temp;
  1. Таблица Temp зарегистрирован в запрос на обновление.

Обновление де Набор STATUS_CD=de_new.STATUS_CD, STATUS_REASON_CD=de_new.STATUS_REASON_CD, TYPE_CD=de_new.TYPE_CD Из DONOR_EMPLOYMENTS как де Внутреннее соединение #New_format_donor_temp как de_new на de_new.EMP_NO = де.EMP_NO Где де.DONOR_ID В ( 3, 4 )

Я не очень опытный с SQL посоветуйте, пожалуйста, какой лучше знаешь.

Выше запросы к серверу MySQL.

Комментарии (0)

Проверить С ниже запроса.

таблицы tablea обновить внутреннее соединение таблицы tableb B на А. name_a = Б. name_b набор validation_check = если(start_dts > end_dts, 'действительный', '')

Комментарии (0)