我有一對(<first_value>, <second_value>),我有以下結構的表:
_____________________________________
| id | first_column | second_column |
我需要插入所有不存在的對。我認為我需要類似的東西,INSERT IF NOT EXIST但對于每一對。
我嘗試使用此代碼:
INSERT INTO <table_name>(<first_column>, <second_column>)
VALUES (CASE
WHEN NOT EXISTS (
SELECT 1
FROM <table_name>
WHERE <first_column> = <pair_1_value_1> AND <second_column> = <pair_1_value_2>
) THEN (<pair_1_value_1>, <pair_1_value_2>)
WHEN NOT EXISTS (
SELECT 1
FROM <table_name>
WHERE <first_column> = <pair_2_value_1> AND <second_column> = <pair_2_value_2>
) THEN (<pair_2_value_1>, <pair_2_value_2>)
.....
END
);
但我得到這個錯誤:INSERT has more target columns than expressions。另外,我認為它不起作用,因為它只會插入首先通過條件的一行。作為if - elif - else其他編程語言的運算子
uj5u.com熱心網友回復:
如果您的兩個條件都為假,則您的查詢會嘗試將零值插入兩列。那不合適。在這種情況下,您需要插入零行和兩列。
SQL中沒有IF;不要試圖模仿它。有WHERE:
CREATE TABLE omg
( first_column text
, second_column text
, PRIMARY KEY (first_column, second_column)
);
WITH wtf (one,two) AS (
VALUES ( 'aa', 'ab')
, ( 'ba', 'bb')
)
INSERT INTO omg(first_column, second_column)
SELECT one, two
FROM wtf w
WHERE NOT EXISTS (
SELECT*
FROM omg nx
WHERE nx.first_column = w.one
AND nx.second_column = w.two
)
;
在您的實際代碼中,最好:
- 創建臨時表 (
CREATE TEMP TABLE wtf as SELECT * FROM omg where 0=1) - 將所有值(來自您的 Python 代碼)插入此臨時表
- 從此臨時表中選擇(不同
wtf)(而不是從CTE 中)
uj5u.com熱心網友回復:
該MERGE宣告不完全符合您的需要嗎?這個例子似乎像你描述的那樣作業,至少對我來說:
CREATE TABLE tgt (a,b) AS (
SELECT 'A','A'
UNION ALL SELECT 'B','B'
UNION ALL SELECT 'C','C'
UNION ALL SELECT 'D','D'
UNION ALL SELECT 'E','E'
UNION ALL SELECT 'F','F'
UNION ALL SELECT 'G','G'
UNION ALL SELECT 'H','H'
UNION ALL SELECT 'I','I'
UNION ALL SELECT 'J','J'
)
;
-- out CREATE TABLE
MERGE INTO tgt
USING (
SELECT 'A','A' UNION ALL
SELECT 'K','K' UNION ALL
SELECT 'L','L'
) src(a,b)
ON src.a=tgt.a
AND src.b=tgt.b
WHEN NOT MATCHED THEN
INSERT VALUES (src.a,src.b)
;
-- out OUTPUT
-- out --------
-- out 2
SELECT * FROM tgt;
-- out a | b
-- out --- ---
-- out A | A
-- out B | B
-- out C | C
-- out D | D
-- out E | E
-- out F | F
-- out G | G
-- out H | H
-- out I | I
-- out J | J
-- out K | K
-- out L | L
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/446065.html
標籤:sql PostgreSQL sql-插入
