在SQLite3

时间:2015-06-23 12:47:51

标签: sqlite left-join union temp-tables create-table


我在一个SQLite3数据库连接中有2个数据库,其中有3个表。我在这些表/数据库上创建一个临时表,以支持更好,更快的搜索/过滤。

这是一个例子。真正的桌子要大得多。

第一桌:
ROWID(唯一)|姓名|姓氏
第二桌:
id(来自第1张表)| phonenumber
第3表:
id(来自第1张表)| emailaddress

我有2个这样的数据库(将来会更多)。要创建临时表,请执行以下操作:(附加了一个数据库连接和一个单独的数据库“pb”。)

CREATE TEMPORARY TABLE temp_table AS 
   SELECT * FROM pb.name_table 
      LEFT JOIN pb.phone_table ON (pb.name_table.id=pb.phone_table.id) 
      LEFT JOIN pb.email_table ON (pb.name_table.id=pb.email_table.id) 
   UNION SELECT * FROM name_table 
      LEFT JOIN phone_table ON (name_table.id=phone_table.id) 
      LEFT JOIN email_table ON (name_table.id=email_table.id);

这会生成如下平面表:
名字|姓氏| PHONENUMBER | EMAILADDRESS

但是(这最终是个问题)如果联系人有(例如:) 3个电话号码和3个电子邮件地址,我会在结果表中获得3 * 3个条目。结果表包含所有电话号码的组合 - 电子邮件地址组合 有没有办法创建一个只有3个条目的平面表?

现状:
名字 - 姓氏 - email1 - phone1
firstname - lastname - email1 - phone2
名字 - 姓氏 - email1 - phone3
firstname - lastname - email2 - phone1
名字 - 姓氏 - email2 - phone2
firstname - lastname - email2 - phone3
firstname - lastname - email3 - phone1
名字 - 姓氏 - email3 - phone2
名字 - 姓氏 - 电子邮件3 - 电话3

最佳解决方案(可能以不同的顺序):
名字 - 姓氏 - email1 - phone1
名字 - 姓氏 - email2 - phone2
名字 - 姓氏 - 电子邮件3 - 电话3

1 个答案:

答案 0 :(得分:0)

好的,花了一些时间,但我摆脱了临时表。我编写了一个" QueryBuilder"它为给定的结果/过滤器/排序/ ...生成查询
它很安静,但是 - 嗯 - 你必须这样做才能提高性能。 :-)

谢谢!