在同一个表上加入基础时减少内部联接的查询次数

时间:2017-11-10 21:22:16

标签: sql postgresql

第2部分跟进Faster way to union table SQL

我有TABLE_A

 from_bank_id          to_bank_id        amount
 1                     null              100        
 null                  1                 200
 1                     null              300        
 null                  2                 200

我有TABLE_B

bank_id      name
1            'BOA'
2            'SOME_BANK'

我需要输出

 from_bank_id  to_bank_id   amount   from_bank_name  to_bank_name
 1             null         100     'BOA'            null
 null          1            200      null            'BOA'
 1             null         300     'BOA'            null      
 null          2            200      null            'SOME_BANK'

现在我正在做

SELECT 
   t1.* 
   t2.name as from_bank_name,
   t3.name as to_bank_name
   FROM TABLE_A as t1
   LEFT OUTER JOIN TABLE_B as t2 ON t1.from_bank_id = t2.bank_id
   LEFT OUTER JOIN TABLE_B as t3 ON t1.to_bank_id = t3.bank_id

1)有更优雅的方式实现这一目标吗? 2)我对TABLE_B进行了多少次数据库查询?我猜2?每个加入一个?

1 个答案:

答案 0 :(得分:0)

简单回答,不是真的。如果你理论上有一个单数bank_id的表,那么你可以通过一个连接到具有银行名称的表来完成这个。

我认为值得指出的是,这是一个非常基本的查询,您可能过早地进行了优化。我认为杰夫阿特伍德(他是一个非常聪明/成功的人)article关于微优化可能对你很好。

off-chance中你有一张像我上面提到的表格,这可行:

create table tblA 
(
    bank_id int,
    amount int,
    mode varchar(10)
);

create table tblB
(
    bank_id int,
    name varchar(10)
);

select
    case 
        when mode = 'Outgoing' then bank_id 
        else null
    end as from_bank_id
    case 
        when mode = 'Outgoing' then name
        else null
    end as from_bank_name
    ,case 
        when mode = 'Incoming' then bank_id 
        else null
    end as to_bank_id
    ,case 
        when mode = 'Incoming' then name
        else null
    end as to_bank_name
    ,amount
from
(
    select
        a.*
        ,b.name
    from
        tblA a
    left join
        tblB b
        on b.bank_id = a.bank_id
);