我目前正在尝试将几个表连接在一起(如果可能,可能还要再连接2个表),但是由于现在的查询方式,我什至看不到3个表的结果
select t1.x,
t1.y,
t1.z,
t4.a,
t4.b,
t4.c,
t4.d
from t1
left join t2 on t1.id=t2.id
left join t3 on t2.id=t3.id
left join t4 on t1.id2=t4.id
where t1.date between 'x' and'x'
and t1.city not in ('x')
and t3.column = x;
是否有一种方法可以优化此代码以使其运行得更快,并使其能够向其中添加更多表?
提前谢谢!
答案 0 :(得分:0)
您的查询存在一些逻辑问题,可能有助于提高速度。
当t2具有相同的id值时,它们将加入到t1中。 然后,当且仅当在t2中存在一行并且与t1和t2具有相同的值时,t3才被拉入。 最后,在您的where子句中,t3.column必须为x,否则将被过滤。
这意味着t3中的行必须存在。每个没有t2记录和t3记录的t1记录都将在其中过滤掉。因此,您不需要左联接,而需要INNER联接。
select t1.x,
t1.y,
t1.z,
t4.a,
t4.b,
t4.c,
t4.d
from t1
inner join t2 on t1.id=t2.id
inner join t3 on t2.id=t3.id
left join t4 on t1.id2=t4.id
where t1.date between 'x' and'x'
and t1.city not in ('x')
and t3.column = x;
在某些DBMS中,您可以将t3.column子句移到join命令,这可以帮助过滤计划中较早的行。
select t1.x,
t1.y,
t1.z,
t4.a,
t4.b,
t4.c,
t4.d
from t1
inner join t2 on t1.id=t2.id
inner join t3 on t2.id=t3.id and t3.column = x
left join t4 on t1.id2=t4.id
where t1.date between 'x' and'x'
and t1.city not in ('x');
我最后的建议是仔细观察t2来确定您是否真的需要它。问问自己,为了得到正确的结果,在t2中必须存在一行吗? ...因为如果t1.id = t2.id,那么t1.id = t3.id,则可以完全消除t2表。