Postgresql

SQL:如果在特定條件下甚至沒有一條記錄,則查詢將記錄插入表中

  • January 4, 2021

我有一個表 train_statuses。架構如下:

CREATE TABLE public.train_statuses (
   id uuid NOT NULL,
   status text NOT NULL,
   updated_at timestamp without time zone NOT NULL
);

Indexes:
   "train_statuses_id_updated_at_key" UNIQUE CONSTRAINT, btree (id, updated_at)
   "idx_train_statuses_id_updated_at" btree (id, updated_at)

此表可以有多個相同 ID 的條目。狀態可以是以下值之一:'cancelled', 'queued','executed', 'failed', 'succeeded'

現在我需要編寫一個查詢,將條目插入到所有狀態為“已取消”或“已取消”train_statuses的所有 IDqueued``executed

我想出了這個查詢

WITH ts AS (
       SELECT 
           DISTINCT ON (ts.id) ts.id, ts.status
       FROM train_statuses ts
       INNER JOIN train_statuses t ON ts.id = t.id
       WHERE 
           ts.status IN ('queued','executed') 
           AND ts.status NOT IN ('failed', 'succeeded','cancelled')
   )
   INSERT INTO train_statuses (id, updated_at, status) SELECT id, now(), 'cancelled' FROM ts

這在技術上是有效的。但我覺得會有一種更優化的方式來完成這項工作。

再次加入train_statuses自身似乎並不那麼好,因為桌子大小在150GB我們左右don't have index on status

請通過並讓我知道是否有更好的方法來獲得所需的結果。

謝謝

注意:如果這個問題有更好的標題,請添加編輯建議。

刪除了多餘的聯接和條件

WITH ts AS (
       SELECT ts.id
        FROM train_statuses ts
        WHERE ts.status IN ('queued','executed')
       EXCEPT
       SELECT ts.id
        FROM train_statuses ts
        WHERE ts.status Not IN ('queued','executed')
)
   INSERT INTO train_statuses (id, updated_at, status) SELECT id, now(), 'cancelled' FROM ts

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