2017-05-24 65 views
0

我正在努力處理以下(顯然)簡單的任務;我的表(稱之爲表1)是這樣的:SQL查詢中的更新表

id | date | value 
------------------ 
1 | 01 | 100 
1 | 02 | 103 
1 | 04 | 105 
1 | 05 | 90 
1 | 06 | 95 
1 | 09 |  0 
2 | 02 | 110 
2 | 03 | 98 
2 | 04 | 97 
2 | 07 | 71 
2 | 08 | 84 
2 | 10 |  0 
------------------ 

我想與更換兩個0,分別爲95和84(即以前的值在時間)。任何解決方案我一直在花時間在這個looot(抱歉,但我很新的SQL)

+2

顯示您到目前爲止所嘗試的內容。你將需要2個更新語句。 1爲您想要更新的每個值。 –

+1

只需要進行兩個查詢,其中ID = 1和Date = 09之後,您更新了一個寫入第二個查詢,其中ID = 2並且日期= 10它不必是複雜的 – SaggingRufus

+0

是否要**更新* *表中的記錄或者是否希望編寫一個**查詢**,其中零是由結果中的前一個值替換的? –

回答

1

試試這個:

update table1 as a 
set a.value=(select b.value 
      from table1 as b 
      where b.date<=a.date order by b.date desc limit 1) 
where a.value=0; 

更改這個

使表1的新副本爲表2(在表1和表2相同的結構&相同的數據):

SET SQL_SAFE_UPDATES = 0; 
update table1 
set value=(select value 
    from table2 
    where table2.date<table1.date order by table2.date desc limit 1) 
where table1.value=0; 
+0

如果這實際上運行沒有錯誤,它可能是一個有效的方法。 –

+0

已經使用了類似的東西,它不起作用。編輯:也試過這個,它不工作 –

+0

@v_emme:請永遠不要說「它沒有工作」在這裏沒有告訴我們究竟發生了什麼。你收到錯誤信息了嗎?是否寫了不正確的值? –

0

對納喬的查詢構建:

MySQL的更新有點有缺陷。首先:它不接受更新表的別名。第二:當你訪問你想在查詢中更新的同一張表時,它會發出抱怨。後者可以很容易地通過用from (select * from table1) b代替from table1 b來解決。

nacho的聲明也錯過了讓子查詢引用相同的ID。他錯誤地包含了該記錄本身(b.date <=而不是b.date <)。

update table1 
set value = 
(
    select b.value 
    from (select * from table1) b 
    where b.id = table1.id and b.date < table1.date 
    order by b.date desc limit 1 
) 
where value = 0; 

這裏是一個測試:http://rextester.com/YQV55035

UPDATE:你明明標記錯誤的DBMS。以下是對SQL Server的相同查詢:

update table1 
set value = 
(
    select top(1) b.value 
    from table1 b 
    where b.id = table1.id and b.date < table1.date 
    order by b.date desc 
) 
where value = 0; 
+0

這不起作用,它給:在'限制'附近語法不正確。 –

+0

這是因爲您用** MySQL **標記了您的問題,但現在看來您的數據庫系統實際上是** SQL Server **,這是另一種產品,它們的SQL方言有所不同。我已經更新了我的答案。 –