2015-01-14 150 views
0

如何更新在where子句更新數據表與選擇

實例與選擇表:

UPDATE 
    cp_asseteventinquiry 
SET 
    cp_asseteventinquiry.Due_Date = date_format (curdate(), '%m/%d/%Y') 

Where (Results of Below Query) 

SELECT 
    Distinct(TopLevelAsset_Num) 
FROM cp_asseteventinquiry 
WHERE 
    cp_asseteventinquiry.History='NO' 
    AND NOT EXISTS(
     SELECT * 
     FROM flightlogs 
     WHERE 
      flightlogs.Asset=cp_asseteventinquiry.TopLevelAsset_Num 
      AND flightlogs.Scheduled_Date=date_format (curdate(), '%m/%d/%Y') 
    ); 
+0

請選擇1個DBMS。你在使用MySql還是SqlServer? – paqogomez

+0

爲什麼SELECT語句中的'TopLevelAsset_Num'周圍存在parens?爲什麼日期值被存儲在字符數據類型的列中,而不是'DATE'數據類型?爲什麼函數名稱DATE_FORMAT和paren之間有空格? – spencer7593

回答

0

使用left join代替:

UPDATE cp_asseteventinquiry ai LEFT JOIN 
     (SELECT TopLevelAsset_Num 
     FROM cp_asseteventinquiry ai2 
     WHERE ai2.History = 'NO' AND 
       NOT EXISTS (SELECT 1 
          FROM flightlogs fl 
          WHERE fl.Asset = ai2.TopLevelAsset_Num AND 
           fl.Scheduled_Date = curdate() 
         ) 
    ) tai 
     ON ai.TopLevelAsset_Num = ai2.TopLevelAsset_Num 
    SET ai.Due_Date = curdate() 
WHERE ai2.TopLevelAsset_Num IS NULL; 

越大問題在於你爲什麼格式化日期一個字符串。始終使用原生格式將日期存儲在數據庫中。如果你的將日期存儲爲一個字符串,則使用yyyy-mm-dd格式,這樣可以正確地排序字符串。

+0

一些如何這不起作用 –

+0

需求是通過使用select查詢獲取需要更新的項目列表,然後更新選擇查詢結果的項目 –

0

這不是完全清楚你想什麼來實現的,但你可以使用這樣的查詢:

UPDATE cp_asseteventinquiry a 
    LEFT 
    JOIN flightlogs f 
    ON f.Asset = a.TopLevelAsset_Num 
    AND f.Scheduled_Date = DATE_FORMAT(CURDATE(), '%m/%d/%Y') 
    SET a.Due_Date = DATE_FORMAT(CURDATE(), '%m/%d/%Y') 
WHERE a.History='NO' 
    AND f.Asset IS NULL 

要設置Due_Date欄上,在History柱具有'NO'值的每一行,並且在flightlogs表中沒有任何滿足指定條件的對應行。

爲什麼你需要格式化日期格式,除非這些文件被存儲在字符類型的列中,這是奇怪的,因爲MySQL有一個定製的數據類型來存儲日期值,數據類型爲DATE


注:不要把括號各地,他們是沒有必要的表情,特別是如果他們不添加任何意義。例如,在此背景下,括號沒有任何意義:

SELECT DISTINCT(TopLevelAsset_Num) ... 

這相當於我們通常所說的使用,

SELECT DISTINCT TopLevelAsset_Num ... 

(添加括號的混淆性使它看起來好像DISTINCT是一個函數,需要一個參數。DISTINCT不是一個函數,這是一個關鍵字。它適用於SELECT列表中的所有表達式,它沒有什麼區別列是否被包裹在括號。


後續

我可以看到你所得到的TopLevelAsset_Num鮮明名單的唯一原因,就是一些具有相同值的行具有History='NO'和其他的沒有。並且您要更新全部行,並匹配TopLevelAsset_Num

在這種情況下,使用內嵌視圖得到的名單,並進行連接操作:

UPDATE cp_asseteventinquiry a 
    JOIN (SELECT n.TopLevelAsset_Num 
      FROM cp_asseteventinquiry n 
      LEFT 
      JOIN flightlogs f 
      ON f.Asset = n.TopLevelAsset_Num 
      AND f.Scheduled_Date = DATE_FORMAT(CURDATE(), '%m/%d/%Y') 
      WHERE n.History='NO' 
      AND f.Asset IS NULL 
     ) v 
    ON v.TopLevelAsset_Num = a.TopLevelAsset_Num 
    SET a.Due_Date = DATE_FORMAT(CURDATE(), '%m/%d/%Y') 
+0

對不起,如果我不清楚!選擇查詢給出了需要更新的項目列表,更新查詢應該選擇選擇查詢的結果。 –