【发布时间】:2021-10-13 10:04:05
【问题描述】:
共有三个表 T1 和 T2 和 T3
T3 存储人员详细信息 T1 存储人的主要电话号码, T2 存储人员的非主要电话号码。
T1
| Personid | Primaryphone | dateload |
|---|---|---|
| 1 | 1001 | 02/08/21 |
| 2 | 1002 | 03/07/21 |
| 4 | 1004 | 04/08/20 |
| 5 | 1005 | 08/09/20 |
T2
| Personid | NonPrimphone | dateload |
|---|---|---|
| 1 | 1011 | 12/03/21 |
| 3 | 1003 | 20/02/21 |
| 4 | 1024 | 30/12/21 |
| 6 | 1006 | 08/08/20 |
| 3 | 1007 | 04/04/21 |
| 3 | 1008 | 21/08/21 |
T3
| Per_numb | person_id |
|---|---|
| 501 | 1 |
| 502 | 2 |
| 503 | 3 |
| 504 | 4 |
| 505 | 5 |
| 506 | 6 |
我想要的是,从 T3 和他们的电话号码中选择所有人员编号,标准是,如果此人有主电话号码,则选择该号码,如果没有主电话号码,则从具有最新日期加载的非主表中选择电话号码。
即
O/p
| Per_numb | phonenumber |
|---|---|
| 501 | 1001 |
| 502 | 1002 |
| 503 | 1008 |
| 504 | 1004 |
| 505 | 1005 |
| 506 | 1006 |
我也想加入这三个表,不要使用子查询,因为子查询会使执行变慢。
【问题讨论】:
-
到目前为止您尝试过什么?您是否查看了 LEFT JOINS 和 CASE 语句以从哪个表中选择哪个字段?
-
我尝试将 tableT3 与 T1 和 T2 连接起来,并使用案例,但问题在于连接 T1 和 T2 时,如果一个人同时拥有主要电话和非主要电话,我会同时获得两个电话号码。我想要什么时候选择来自T1的电话号码时,在我的情况下,所有这些表都不应该在我的情况下有lakh的行,所以我的表现非常受损。 span>
-
“因为子查询使执行变慢”?你从哪里得到这个想法的?您对 Oracle 优化器的工作原理了解多少?如果您的查询中有子查询并且优化器认为连接会更好,优化器将应用该优化本身,它不需要您的帮助(当然不需要像您这样的简单查询)!