В MySQL - запрос на обновление на основе запроса на выборку
мне нужно проверить (из той же таблицы), есть ли связь между двумя событиями на основе даты-времени.
один набор данных будет содержать конечную дату-время определенных событий, а другой набор данных будет содержать начальную дату-время для других событий.
Если первое событие завершается до второго события, то я хотел бы связать их.
то, что у меня есть до сих пор:
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?
12 ответов:
вы можете сделать это одним из двух способов:
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)выберите тот, который кажется вам наиболее естественным.
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Трааа! Он отлично работает!
С выше понимания, вы можете изменить набор полей и "на" критерии, чтобы сделать вашу работу. Вы также можете выполнить проверки, затем вытащить данные во временную таблицу(таблицы), а затем запустить обновление, используя приведенный выше синтаксис замена имен таблиц и столбцов.
надеюсь, что это работает, если не дайте мне знать. Я напишу точный запрос для вас.
Я нашел этот вопрос в поисках моего решения очень сложного соединения. Это альтернативное решение, более сложная версия проблемы, которая, как я думал, может быть полезной.
мне нужно было заполнить поле product_id в таблице activities, где действия нумеруются в единице, а единицы нумеруются на уровне (идентифицируются с помощью строки ??N), такой, что один может определить виды деятельности, используя сеи L1U1A1 тоесть. Эти конфигурации сохраняются в разных стол.
Я определил следующее, Чтобы получить список 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.
наконец я решил его, используя следующие запросы:
запрос 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;временная таблица присоединяется к запросу обновления.
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 внутренняя таблица соединения B на A. name_a = B. name_b установите validation_check = if(start_dts > end_dts,' VALID',")
Comments