2017-02-23 112 views
1

我有一個包含三個表'contacts','names'和'contact_names'的數據庫。SQLite多次插入選擇結果

create table contacts(id integer, gid integer, sid integer); 
create table names(id integer primary key, name text); 
create table contact_names(fullname text); 

insert into names(name) values ('Eberhard'); 
insert into names(name) values ('Esche'); 

insert into contacts values(1, (select id from names where name='Eberhard'), (select id from names where name='Esche')); 

現在我想插入一對「給定名稱+姓」兩次,一次是爲「給定名稱+姓」,一次是「姓+給定的名稱」。我現在已經是這樣的statment產生這些名字:

SELECT gTable.name || ' ' || sTable.name AS name1, sTable.name || ' ' || gTable.name AS name2 FROM 
(
    SELECT name FROM names WHERE id=2 
) AS gTable, 
(
    SELECT name FROM names WHERE id=1 
) AS sTable; 

我什麼不能執行,現在要插入這些名稱表「contact_names」使用這樣的事情:

INSERT INTO contact_names VALUES (name1), (name2) WITH 
SELECT gTable.name || ' ' || sTable.name AS name1, sTable.name || ' ' || gTable.name AS name2 FROM 
(
    SELECT name FROM names WHERE id=2 
) AS gTable, 
(
    SELECT name FROM names WHERE id=1 
) AS sTable; 

由於結果表'contact_names'應包含兩個條目(行)「Esche Eberhard」和「Eberhard Esche」。有沒有人有線索如何實現這一目標?當然,我可以兩次執行select語句,但我寧願用一個選擇來執行此操作。

BR,尤杜

PS:也許是有用的解釋我爲什麼要這麼做。 'contact_names'的INSERT語句應該通過在從'contacts'中刪除條目時調用的觸發器來執行。如果我刪除例如一排

DELETE FROM contacts WHERE id=1; 

那麼接觸的兩個名字組合應被插入到「contact_names」(這些名稱的進一步處理)。處理刪除的名稱後,表格將被定期清除。

+0

這似乎是一個非常奇怪的要求。看起來名字和姓氏被存儲在'names'表中的不同_records_中,但是你想要轉換它,並且重複第一個/最後一個組合。 –

回答

0

你有一行兩列,但你想要兩行一列。

在一般情況下,這可以用一個common table expressioncompound query來完成:

WITH TwoColumns(a, b) AS (
    SELECT a, b FROM ...  -- the original two-column query 
) 
INSERT INTO ...(x) 
SELECT a FROM TwoColumns 
UNION ALL 
SELECT b FROM TwoColumns; 

在這種情況下,我們並不需要那麼多的子查詢和可以簡化一點:

WITH gs(gName, sName) AS (
    SELECT g.name, 
      s.name 
    FROM names AS g, 
     names AS s 
    WHERE g.id = 2 
     AND s.id = 1 
) 
INSERT INTO contact_names(fullname) 
SELECT gName || ' ' || sName FROM gs 
UNION ALL 
SELECT sName || ' ' || gName FROM gs; 
+0

謝謝你的解決方案,它解決了這個問題。我只想提到sqlite3 3.8.2版不理解這種語法,我總是會收到一條錯誤消息,說明WITH語句存在問題。在另一臺機器上使用sqlite3版本3.11.0,該語句可以工作,所以顯然舊版本不支持這種WITH。 – drhuh