MySQL-запрос обновления на основе запроса 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, запустить запрос обновления с помощью SELECT nested?

12 ответов


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

MySQL update синтаксис соединения:

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

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

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)

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


UPDATE
    `table1` AS `dest`,
    (
        SELECT
            *
        FROM
            `table2`
        WHERE
            `id` = x
    ) AS `src`
SET
    `dest`.`col1` = `src`.`col1`
WHERE
    `dest`.`id` = x
;

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


легко в MySQL:

UPDATE users AS U1, users AS U2 
SET U1.name_one = U2.name_colX
WHERE U2.user_id = U1.user_id

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

этот лучше и чистый для всех уровней:

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 

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

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

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


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

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

Я определил следующее, Чтобы получить список activity_id vs 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)

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

CREATE TEMPORARY TABLE activity_product_ids AS (<the above select statement>);

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

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


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 ;

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


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

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 [column_name] = (SELECT [column_name] FROM [table_name] WHERE [column_name] = [value]) WHERE [column_name] = [value];

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


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];

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

UPDATE Station AS st1, StationOld AS st2
   SET st1.already_used = 1
 WHERE st1.code = st2.code

для той же таблицы,

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;

у меня была проблема с дубликатами записей в одной таблице. Ниже приведены подходы, которые работали для меня. За это также выступал @sibaz.

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

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

    IF OBJECT_ID(N'tempdb..#New_format_donor_temp', N'U') IS NOT NULL
        DROP TABLE #New_format_donor_temp;
    
    select *
    into #New_format_donor_temp
    from DONOR_EMPLOYMENTS
    where DONOR_ID IN (
      1, 2
    )
    
    -- Test New_format_donor_temp
    -- SELECT *
    -- FROM #New_format_donor_temp;
    
  2. временная таблица соединяется в запросе обновления.

    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 AS de
      INNER JOIN #New_format_donor_temp AS de_new ON de_new.EMP_NO = de.EMP_NO
    WHERE
      de.DONOR_ID IN (
        3, 4
    )
    

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

вышеуказанные запросы для сервера MySql.


проверьте с помощью запроса ниже.

обновить таблицу A внутреннее соединение tableB B на A. name_a = B. name_b установите validation_check = if (start_dts > end_dts, 'VALID', ")