将查询从子查询更改为联接

时间:2013-12-06 22:30:02

标签: sql database postgresql

我正在尝试优化查询,我相信我可以使用连接而不是子查询来执行此操作,但我不知道如何操作。贝娄是我的疑问:

SELECT * 
FROM   accounts 
WHERE  LOWER(firstname) = LOWER('Sam') 
       AND id IN (SELECT account_id 
                  FROM   addresses 
                  WHERE  LOWER(name) = LOWER('Street1')) 
       AND id IN (SELECT account_id 
                  FROM   alternate_ids 
                  WHERE  alternate_id_glbl = '5'); 

我有3个表:帐户,地址和备用ID。当我进行搜索时,我想返回名为Sam的地址集,街道1的地址和备用ID为5的帐户。

地址和备用ID表中有一个account_id列,其中包含与其关联的帐户的ID。

您对如何将其转换为使用连接或可能更有效查询的查询有任何想法吗?

哦,这是一个postgres DB

3 个答案:

答案 0 :(得分:1)

试试这个:

SELECT acc.* 
FROM accounts acc 
JOIN addresses addr ON acc.id = addr.account_id
JOIN alternate_ids ids ON acc.id = ids.account_id
WHERE LOWER(acc.firstname) = LOWER('Sam') 
AND LOWER(addr.name) = LOWER('Street1') 
AND ids.alternate_id_glbl = '5';

但是,由于查询优化器通常会自动调整执行计划,因此无法保证此版本能够更好地工作。

答案 1 :(得分:0)

您是否检查过执行计划以确定它是否已使用加入?如果可能,查询优化器将执行此操作。

您可以在帐户表LOWER(名字)和地址表LOWER(名称)上放置索引。

答案 2 :(得分:0)

SELECT acc.*
FROM accounts acc
JOIN addresses add
  ON acc.id = add.account_id
    AND LOWER(add.name) = LOWER('Street1')
JOIN alternate_ids alt
  ON acc.id = alt.account_id
    AND alt.alternate_id_glbl = '5'
WHERE LOWER(acc.firstname) = LOWER('Sam');