MySQL-基於SELECT查詢的UPDATE查詢

我須要檢查(從同一張表)基於日期時間的兩個事件之間是否存在關聯。 mysql

一組數據將包含某些事件的結束日期時間,另外一組數據將包含其餘事件的開始日期時間。 web

若是第一個事件在第二個事件以前完成,那麼我想將它們連接起來。 sql

到目前爲止,我有: 數據庫

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

而後我加入他們: spa

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查詢嗎? code


#1樓

若是有人試圖將數據從一個數據庫更新到另外一個數據庫,而不管他們針對的是哪一個表,那麼都必須有一些標準。 事件

這對全部級別的人來講都是更好和乾淨的: ip

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

特拉! 效果很好! 字符串

基於以上理解,您能夠修改設置字段和「啓用」條件來進行工做。 您還能夠執行檢查,而後將數據拉入臨時表,而後使用上述語法替換表名和列名來運行更新。 get

但願它能奏效,若是不能讓我知道。 我會爲您寫一個確切的查詢。


#2樓

您實際上能夠經過如下兩種方式之一執行此操做:

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)

選擇最適合您的那個。


#3樓

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

但願這對您有用。


#4樓

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 ;

但願這對您必須在兩個表之間進行匹配和更新的狀況有所幫助。


#5樓

我在尋找本身的很是複雜的聯接解決方案時發現了這個問題。 這是該問題的更復雜版本的替代解決方案,我認爲這多是有用的。

我須要在活動表中填充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;

我但願有人以爲這有用

相關文章
相關標籤/搜索