Sql 连接多个大表

Sql 连接多个大表,sql,sybase,Sql,Sybase,我有三张桌子 Table T1: Columns {a,b,c}, combination {a,b} is unique in Table T1 Table T2: Columns {a,c,d}, combination {a,c} is unique in Table T2 Table T3: Columns {a,c,e}, combination {a,c} is unique in Table T3 其中{a,b,c}是字符串{d,e}是数字 我希望我的输出是 Table T4:

我有三张桌子

Table T1: Columns {a,b,c}, combination {a,b} is unique in Table T1
Table T2: Columns {a,c,d}, combination {a,c} is unique in Table T2
Table T3: Columns {a,c,e}, combination {a,c} is unique in Table T3
其中{a,b,c}是字符串{d,e}是数字

我希望我的输出是

Table T4: Columns {a,b} where e/d < x.
表T4:e/d
表T1、T2、T3都非常大(数百万行),所以我实现这一点的方法是对表T1、T2执行左连接并将结果保存到临时表,然后对表T1、T3执行左连接并保存结果,然后对结果执行左连接,最后将这些临时表合并到一个最终表中


我的问题是,有没有更好/更有效的方法在不破坏数据库的情况下执行此操作?

您是否尝试过直接执行此操作

select t1.a, t1.b
into t4
from t1
join t2 on t1.a = t2.a and t1.c = t2.c
join t3 on t1.a = t3.a and t1.c = t3.c
where t3.e / t2.d < x
选择t1.a、t1.b
转入t4
从t1开始
在t1.a=t2.a和t1.c=t2.c上连接t2
在t1.a=t3.a和t1.c=t3.c上连接t3
其中t3.e/t2.d

在临时表中存储数百万条记录对性能或存储都没有好处

你有没有试过直接这么做

select t1.a, t1.b
into t4
from t1
join t2 on t1.a = t2.a and t1.c = t2.c
join t3 on t1.a = t3.a and t1.c = t3.c
where t3.e / t2.d < x
选择t1.a、t1.b
转入t4
从t1开始
在t1.a=t2.a和t1.c=t2.c上连接t2
在t1.a=t3.a和t1.c=t3.c上连接t3
其中t3.e/t2.d

在临时表中存储数百万条记录对性能或存储都没有好处

这些表上有哪些索引?这些表上有哪些索引?我同意这一点,除非OP的数据库对于其存储需求来说太小,否则这应该可以正常工作。因此,也许我不太了解SQL,但联接是笛卡尔积(因此,如果我有两个表,一个有10行,另一个有10MM行,它将创建一个有100MM行的表并进行消去).否?如果您是在键上加入,则不会。笛卡尔积仅在您不在键上加入时发生。在您的示例中,如果您在10行表上有一个FK作为10行表中的PK,那么您只返回10行,结果集中包含10行表中的数据。您在T2和T3上都进行筛选。左加入不起作用有意义,因为您使用的是两个表中的数据。最后一个问题:如果我现在加入的数据超过2(大)表,继续添加连接子句而不是尝试使用临时表是否更好?我同意这一点,除非OP的数据库对于其存储需求来说太小,否则这应该可以正常工作。因此,也许我不太了解SQL,但是连接可以做笛卡尔积(因此,如果我有两个表,一个有10行,另一个有10MM行,它将创建一个有100MM行的表并进行消去).否?如果您是在键上加入,则不会。笛卡尔积仅在您不在键上加入时发生。在您的示例中,如果您在10行表上有一个FK作为10行表中的PK,那么您只返回10行,结果集中包含10行表中的数据。您在T2和T3上都进行筛选。左加入不起作用最后一个问题:如果我现在连接两个以上(大)的表,是否继续添加连接子句而不是尝试使用临时表更好?