关于MySQL:MySQL – 基于SELECT Query的UPDATE查询

MySQL - UPDATE query based on SELECT Query

我需要(从同一个表)检查基于日期时间的两个事件之间是否存在关联。

一组数据将包含特定事件的结束日期时间,另一组数据将包含其他事件的开始日期时间。

如果第一个事件在第二个事件之前完成,那么我想将它们链接起来。

到目前为止,我拥有的是:

1
2
3
4
5
6
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

然后我加入他们:

1
2
3
4
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

然后,我可以基于我的验证检查字段,使用select嵌套运行更新查询吗?


实际上,您可以通过以下两种方式之一进行操作:

MySQL更新联接语法:

1
2
3
4
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语法:

1
2
3
4
5
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)

选择你觉得最自然的。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
UPDATE
    `table1` AS `dest`,
    (
        SELECT
            *
        FROM
            `table2`
        WHERE
            `id` = x
    ) AS `src`
SET
    `dest`.`col1` = `src`.`col1`
WHERE
    `dest`.`id` = x
;

希望这对你有用。


在MySQL中容易:

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

如果有人试图将数据从一个数据库更新到另一个数据库,而不管目标是哪个表,都必须有一些条件来完成。

这是一个更好的和清洁的各级:

1
2
3
4
5
6
7
8
9
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

特拉!很好用!

有了以上的理解,您可以修改设置字段和"打开"条件来完成您的工作。您还可以执行检查,然后将数据拉入临时表,然后使用上面的语法替换表名和列名运行更新。

希望它能起作用,如果不让我知道的话。我会给你写一个确切的问题。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 ;

希望这能帮助您在两个表之间进行匹配和更新。


我在寻找一个非常复杂的连接的解决方案时发现了这个问题。对于更复杂的问题,这是另一种解决方案,我认为这可能有用。

我需要填充Activities表中的Product_id字段,其中Activities在一个单元中编号,Units在一个级别中编号(使用字符串标识)??n),这样就可以使用sku ie l1u1a1识别活动。然后将这些SKU存储在不同的表中。

我确定了以下内容以获取活动ID与产品ID的列表:

1
2
3
4
5
6
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中的select中,因此我创建了一个临时表,并将其与update语句连接起来:

1
2
3
4
5
6
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;

我希望有人觉得这个有用


1
2
3
4
5
6
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];

您可以使用这样的内部联接从另一个表更新值

1
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作为子查询来执行此操作

1
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/


对于同一张桌子,

1
2
3
4
5
6
7
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;

你可以使用:

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

检查下面的查询。

更新表Aa.name_a=b.name_b上的内部联接表b设置validation_check=if(start_dts>end_dts,'valid','')


我在一个表中遇到了重复条目的问题。下面是我的方法。它也被@sibaz所倡导。

最后,我使用以下查询解决了它:

  • 选择查询保存在临时表中

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    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;
  • 临时表已加入到更新查询中。

    1
    2
    3
    4
    5
    6
    7
    8
    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服务器的。