首页 文章

MySQL - 基于SELECT Query的UPDATE查询

提问于
浏览
401

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

一组数据将包含某些事件的结束日期时间,另一组数据将包含其他事件的开始日期时间 .

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

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

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嵌套运行UPDATE查询吗?

12 回答

  • 4

    同桌,

    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;
    
  • 84

    请查看以下查询 .

    update tableA A inner join tableB B on A.name_a = B.name_b set validation_check = if(start_dts > end_dts, 'VALID', '')

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

    希望这对你有用 .

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

    希望在您必须在两个表之间进行匹配和更新的情况下,这将帮助您 .

  • 11

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

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

    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/

  • 238

    您可以使用:

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

    如果有人正在寻求将数据从一个数据库更新到另一个数据库而不管他们所针对哪个表,那么必须有一些标准来实现它 .

    对于所有级别,这个更好,更干净:

    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!它很棒!

    通过上述理解,您可以修改设置字段和“开启”条件来完成您的工作 . 您还可以执行检查,然后将数据拉入临时表,然后使用上述语法替换表和列名来运行更新 .

    希望它有效,如果不让我知道 . 我会为你写一个确切的查询 .

  • 45

    在MySQL中很容易:

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

    我在一个表本身有重复条目的问题 . 以下是我的工作方法 . @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服务器 .

  • 11

    我在寻找一个非常复杂的连接的自己的解决方案时发现了这个问题 . 这是一个替代解决方案,对于更复杂的问题版本,我认为这可能是有用的 .

    我需要在活动表中填充product_id字段,其中活动以单元编号,单元在一个级别中编号(使用字符串?? N标识),以便可以使用SKU(即L1U1A1)识别活动 . 然后将这些SKU存储在不同的表中 .

    我确定了以下内容以获取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中的SELECT中,所以我创建了一个临时表,并使用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;
    

    我希望有人觉得这很有用

  • 3

    您实际上可以通过以下两种方式之一来完成

    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)
    

    挑选一个对你来说最自然的东西 .

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

相关问题