我正在尝试优化查询,我相信我可以使用连接而不是子查询来执行此操作,但我不知道如何操作。贝娄是我的疑问:
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
答案 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');