2016-12-07 38 views
2

我有一个界面中,我将展示从的SQLite数据库项的列表,每个项目可以是两种类型之一:的SubItem1SubItem2。该数据库目前有三个表格:项目,子项目1子项目2优化加入

物品包含列SubItemId类型(0 - 的SubItem1; 2 - SubItem2)

的SubItem1SubItem2具有不同的列,但它们中的一个很好的量是一样。

所以使用填充这个名单我使用的查询,如:

select i.*, s1.name, s2.name, s1.time, s2.place 
from ITEMS i 
left outer join sub1 s1 on (i.type = 0 and i.sub_id = s1.id) 
left outer join sub2 s2 on (i.type = 1 and i.sub_id = s2.id) 

我用这些列作为一个例子,但我选择各个子项表中的约10列。

使用此查询,我得到了大量的冗余行。例如,当某个特定项目的类型为SubItem1时,我也将收到表格SubItem2的空列。

是否有更有效的方法来进行此查询?

谢谢。

+0

样本数据和期望的结果将有助于解释你想完成什么。 –

回答

0

的“相同”列使用COALESCE()

select i.*, COALESCE(s1.name,s2.name) as name, 
      COALESCE(s1.col1,s2.col2) as col2, 
      .... 
     s1.time, s2.place 
from ITEMS i 
left outer join sub1 s1 on (i.type = 0 and i.sub_id = s1.id) 
left outer join sub2 s2 on (i.type = 1 and i.sub_id = s2.id) 
0

可以seperately选择这两种类型的内部连接,然后两个结果与compound query结合:

SELECT i.*, s.name, s.time, NULL AS place 
FROM Items AS i 
JOIN Sub1 AS s ON i.sub_id = s.id 

UNION ALL 

SELECT i.*, s.name, NULL, s.place 
FROM Items AS i 
JOIN Sub2 AS s ON i.sub_id = s.id; 

这些都有可能效率更高。

+0

感谢您打开关于使用UNION的想法。但结果显示,不使用UNION时性能略有提高。 –