我有一个问题,我必须尝试找到具有未结余额的旧帐户但已创建新帐户的人.我需要通过比较SSN来匹配它们.问题是我们有主要和额外的联系人,因此每个帐户有2个潜在的SSN.我需要匹配它,即使它们最初是主要的,但现在是次要的等等.
这是我的第一次尝试,我现在只是为了获得连接和条件.我稍后会选择实际数据.基本上,个人表连接一次到活动帐户,另一个连接到拖欠帐户.然后基于SSN可能相关的4种可能方式来比较对个人表的两个引用.
select count(*)
from personal pa
join consumer c
on c.cust_nbr = pa.cust_nbr
and c.per_acct = pa.acct
join personal pu
on pu.ssn = pa.ssn
or pu.ssn = pa.addl_ssn
or pu.addl_ssn = pa.ssn
or pu.addl_ssn = pa.addl_ssn
join uncol_acct u
on u.cust_nbr = pu.cust_nbr
and u.per_acct = pu.acct
where u.curr_bal > 0
Run Code Online (Sandbox Code Playgroud)
这有效,但运行需要20分钟.我发现这个问题在INNER JOIN条件下有一个"OR"是个坏主意吗?所以我尝试将其重新编写为4个查询(每个ssn组合一个)并将它们合并.这需要30分钟才能运行.
有没有更好的方法来做到这一点,或者它只是一个非常低效的过程,无论你如何做到这一点?
更新: 在这里玩了一些选项后,以及其他一些实验我认为我发现了问题.我们的软件供应商对数据库中的SSN进行加密,并提供解密它们的视图.由于我必须从该视图开始工作,因此需要很长时间才能解密然后进行比较.
如果您运行单独的联接然后再联合,那么您可能会遇到问题。如果同一记录对至少满足两个条件怎么办?然后你的结果中将会有重复的内容。
我相信你的第一种方法是可行的,但不要忘记你正在连接四个表。如果各个表中的行数为 A、B、C、D,则 RDBMS 将必须检查最多 A * B * C * D 条记录。如果数据库中有很多记录,那么这将花费很多时间。
当然,您可以通过向某些列添加索引来优化查询,如果它们尚未建立索引,这将是一个好主意。但不要忘记,如果向列添加索引,那么 RDBMS 从该列读取的速度会更快,但写入的速度会较慢。如果您的操作主要是读取(选择),那么您应该为列建立索引,但不要盲目,在开始执行之前先研究一下索引。
另外,如果您要连接四个表:personal、consumer、personal(再次)和 uncol_acct,那么您可能会执行以下操作:
编写一个查询,其中包含两个子查询,每个子查询分别命名为 t1 和 t2。第一个子查询连接个人和消费者,并将结果命名为 t1。第二个查询将第二次出现的personal 与uncol_acct 连接起来,where 子句将位于第二个连接内。如前所述,您的查询将包含两个子查询,分别名为 t1 和 t2。您的查询将连接 t1 和 t2。这样您就可以进行优化,因为您的主查询将仅考虑有效 t1 和 t2 的配对。
此外,如果您的 where 子句位于示例查询中的外部,则将执行 4 维联接,并且只有在此之后才会考虑 where 。这就是为什么 where 子句应该位于第二个子查询内,这样 where 子句将在主连接之前运行。另外,您可以在第二个子查询中创建一个子查询来计算条件很少满足的情况。
干杯!
| 归档时间: |
|
| 查看次数: |
3824 次 |
| 最近记录: |