Sqlite

從另一個表中的數據更新一個表中的值

  • May 10, 2018

我有一個使用 SQLite 的應用程序,其中有兩個表一個master表和一個scheduled表。

如果我在發生master後的某個時間執行查詢,我想用預定表中的值更新表中的值。更新表格後,我想從表格中刪除這些due值。master``scheduled

想像這是開始狀態:

Table: master
  id    value 
  ---   -----
  1     "Buy"
  2     "Buy"

Table: scheduled
  key   id   value   due
  ----  ---  ------  -----
  1     1    "Sell"  2018-01-01 12:01:00
  2     2    "Sell"  2018-01-01 12:01:00
  3     1    "Buy"   2019-02-02 13:00:00

我正在嘗試製作一個查詢,如果我在之後執行它2018-01-01 12:01:00,我想看看:

Table: master
  id    value 
  ---   -----
  1     "Sell"
  2     "Sell"

Table: scheduled
  key   id   value   due
  ----  ---  ------  -----
  3     1    "Buy"   2019-02-02 13:00:00

我是新的 SQLite,我得到的最接近的是以下內容:

UPDATE master
 SET
   value = (SELECT scheduled.value FROM scheduled WHERE scheduled.id = master.id)
 WHERE
   EXISTS (SELECT * FROM scheduled WHERE scheduled.due >= ?);

不幸的是,這似乎不起作用,我什至不確定從DELETE.

為了回答問題的第一部分,我做了以下事情:

創建了兩個表:

CREATE TABLE master
(
 m_id INTEGER,
 m_value VARCHAR(4)
);

CREATE TABLE scheduled
(
 key INTEGER,
 s_id  INTEGER,
 s_value VARCHAR(4),
 due TIMESTAMP
);

添加了一些記錄:

INSERT INTO master VALUES (1, 'Buy');
INSERT INTO master VALUES (2, 'Buy');

INSERT INTO scheduled VALUES (1, 1, 'Sell', '2018-01-01 12:00:00');
INSERT INTO scheduled VALUES (2, 2, 'Sell', '2018-01-01 12:00:01');
INSERT INTO scheduled VALUES (3, 1, 'Buy',  '2019-01-01 12:00:00');

然後我執行了以下查詢:

UPDATE master
SET m_value =
(
 SELECT s_value
 FROM scheduled s
 WHERE s_id = m_id
 AND due <= CURRENT_DATE
);

SELECT * FROM master之後的結果UPDATE

m_id   m_value
  1      Sell
  2      Sell

您可以在此處的 dbfiddle 上找到所有這些內容。下次您提出問題時,您可能會發現為那些試圖解決您的問題的人設置一個 dbfiddle 是有益的 - 幫助我們幫助您!

順便說一句,SQLite(與其他系統不同)不支持 UPDATEs 和JOINs。我不確定標準對使用這些內容有何規定,但這是您使用連接完成的範例

UPDATE master
SET m_value = s.s_value
FROM  master m
JOIN scheduled s ON m.m_id = s.s_id
WHERE s.due <= NOW();

要回答問題的第二部分,請將所有工作(兩個單獨的語句)合二為一(此處TRANSACTION的文件,此處的範例)。不幸的是,dbfiddle 似乎不支持這一點。 但是,我們很幸運,這個 db-fiddle(注意連字元!)確實支持s - 請在此處查看您問題的完整答案。如果我的解決方案對您沒有幫助,請告訴我。TRANSACTION

引用自:https://dba.stackexchange.com/questions/206317