2017-02-23 82 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