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 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)
Выберите тот, который кажется вам наиболее естественным.
Ответ 2
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
Ответ 4
Если кто-то пытается обновить данные из одной базы данных в другую, независимо от того, на какую таблицу он ориентируется, для этого должны быть определенные критерии.
Этот лучше и чище для всех уровней:
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! Работает отлично!
С учетом вышеизложенного вы можете изменить установленные поля и критерии включения для выполнения своей работы. Вы также можете выполнить проверки, затем перетащить данные во временную таблицу (таблицы) и затем запустить обновление, используя приведенный выше синтаксис, заменяя имена таблиц и столбцов.
Надеюсь, что это работает, если нет, дайте мне знать. Я напишу точный запрос для вас.
Ответ 5
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 ;
Надеюсь, что это поможет вам в случае, когда вы должны сопоставить и обновить между двумя таблицами.
Ответ 6
Я нашел этот вопрос в поиске собственного решения очень сложного соединения. Это альтернативное решение более сложной версии проблемы, которая, на мой взгляд, может оказаться полезной.
Мне нужно было заполнить поле product_id в таблице действий, где действия пронумерованы в единице, а единицы пронумерованы на уровне (идентифицируемом с помощью строки?? N), чтобы можно было идентифицировать операции с использованием SKU, то есть L1U1A1. Эти SKU затем хранятся в другой таблице.
Я определил следующее, чтобы получить список action_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)
Я обнаружил, что это слишком сложно для включения в SELECT в mysql, поэтому я создал временную таблицу и соединил ее с оператором обновления:
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;
Я надеюсь, что кто-то найдет это полезным
Ответ 7
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];
Ответ 8
Вы можете обновить значения из другой таблицы, используя внутреннее соединение, как это
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/
Ответ 9
Вы можете использовать:
UPDATE Station AS st1, StationOld AS st2
SET st1.already_used = 1
WHERE st1.code = st2.code
Ответ 10
Для той же таблицы,
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;
Ответ 11
У меня была проблема с повторяющимися записями в одной таблице. Ниже подходы помогли мне. Это также было защищено @sibaz.
Наконец я решил это, используя следующие запросы:
-
Запрос на выборку сохраняется во временной таблице
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.
Ответ 12
Проверьте с помощью запроса ниже.
обновить таблицу A Внутренняя таблица соединений B B для A.name_a = B.name_b set validation_check = if (start_dts> end_dts, 'VALID', '')