优化2个不相关的table join
Optimization of 2 unrelated table join
我有一个界面,我将在其中显示来自 SQLite 数据库的项目列表,每个项目可以是以下两种类型之一:SubItem1 和 子项目 2。此数据库当前有三个 table:Items、SubItem1 和 SubItem2.
tableItems 包含列 SubItemId 和 Type(0 - 子项目 1;2 - 子项目 2)
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)
我以这些列为例,但我选择了每个子项的大约 10 列 table。
通过这个查询,我得到了很多冗余行。例如,当特定项目的类型为 SubItem1 时,我还将收到 table SubItem2
的空列
是否有更有效的查询方式?
谢谢。
对 "same" 列使用 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)
您可以 select 两种类型分别使用内部联接,然后将两种结果与 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;
这些可能更有效。
我有一个界面,我将在其中显示来自 SQLite 数据库的项目列表,每个项目可以是以下两种类型之一:SubItem1 和 子项目 2。此数据库当前有三个 table:Items、SubItem1 和 SubItem2.
tableItems 包含列 SubItemId 和 Type(0 - 子项目 1;2 - 子项目 2)
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)
我以这些列为例,但我选择了每个子项的大约 10 列 table。
通过这个查询,我得到了很多冗余行。例如,当特定项目的类型为 SubItem1 时,我还将收到 table SubItem2
的空列是否有更有效的查询方式?
谢谢。
对 "same" 列使用 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)
您可以 select 两种类型分别使用内部联接,然后将两种结果与 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;
这些可能更有效。