Postgresql
SQL:如果在特定條件下甚至沒有一條記錄,則查詢將記錄插入表中
我有一個表 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