2015-09-29 20 views
1

我有一個 DB與不同的表。 我在做什麼是UPDATE表中的最後一個插入的行與來自另一個記錄的數據來自同一個表或另一個類似的表。SQLITE UPDATE字段IF NULL來自另一個表

我知道它的工作,但我想知道如果我的解決方案是正確的或缺少的東西,如果我可以寫在一個更緊湊和更迅速的方式。

此外,我的代碼是非常非常難以管理的,因爲如果將來表結構將改變我將必須重寫查詢來添加或刪除字段。

如果可以編寫一個查詢,該查詢從一個表中獲取一個完整記錄並更新同一個表的另一個記錄中的所有NULL字段,那麼我很徘徊。

sprintf(global_sql, "UPDATE "\ 
         "Table1 "\ 
        "SET "\ 
         "fiedl1 = case when fiedl1 is null then (SELECT fiedl1 FROM Table1 WHERE Table1_id = %d) else fiedl1 end, "\ 
         "fiedl2 = case when fiedl2 is null then (SELECT fiedl2 FROM Table1 WHERE Table1_id = %d) else fiedl2 end, "\ 
         "fiedl3 = case when fiedl3 is null then (SELECT fiedl3 FROM Table1 WHERE Table1_id = %d) else fiedl3 end "\ 
        "WHERE "\ 
         "Table1_id = (SELECT max(Table1_id) FROM Table1)", sourceRecord_idx, sourceRecord_idx, sourceRecord_idx); 

正如你可以看到每個單場我一定要寫它的具體SET情況下,而且每一個提交的值由選擇檢索。

我想/希望有一個更簡單和更可維護的方式來做到這一點。

+0

不,沒有辦法做到這一點。這是一件好事,因爲這不是一個好主意。總會有例外,你作爲程序員必須意識到每個添加的字段並決定是否應用例外。 – Ben

+0

@Ben我可以同意你的看法,但是有一種不同的方法可以避免單個SELECT從源記錄中檢索單個字段? – LPs

回答

1

您可能認爲這略微更容易維護,
至少它有一些「三抄碼」少:

with shortcut(f1, f2, f3) as 
(SELECT fiedl1, fiedl2, fiedl3 FROM Table1 WHERE Table1_id = %d) 
UPDATE Table1 SET 
    fiedl1 = ifnull(fiedl1, (SELECT f1 FROM shortcut)), 
    fiedl2 = ifnull(fiedl2, (SELECT f2 FROM shortcut)), 
    fiedl3 = ifnull(fiedl3, (SELECT f3 FROM shortcut)) 
WHERE Table1_id = (SELECT max(Table1_id) FROM Table1) 
; 

詳情:

  • 使用CTE爲少重複條件和其他快捷方式
  • 使用ifnull使條件值更簡單,更短

在SQLite 3.9.1上測試,使用固定值代替%d

+0

好戲。這是一個老項目。我會在接下來的日子裏出手。 – LPs

相關問題