我有一个接口,在其中我将显示来自SQLite数据库的项目列表,每个项目可以是两种类型中的一种:SubItem1和SubItem2。该数据库目前有三个表:Item、SubItem1和SubItem2。
表Item包含SubItemId和类型 (0 - SubItem1;2- SubItem2)列。
SubItem1和SubItem2有不同的列,但大部分列是相同的。
因此,为了使用填充这个列表,我使用了如下查询:
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)我使用了这些列作为示例,但我选择了每个SubItem表的大约10列。
有了这个查询,我得到了很多多余的行。例如,当特定项的类型为SubItem1时,我还将接收表SubItem2的空列
是否有更有效的方法来进行此查询?
谢谢。
发布于 2016-12-07 12:24:33
对“相同”列使用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)发布于 2016-12-07 14:28:46
可以使用内部联接分别选择这两种类型,然后将这两种结果与复合查询组合起来。
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;这可能会更有效率。
https://stackoverflow.com/questions/41017350
复制相似问题