我有一个如下查询:
select
a.id, a.title, a.description
from
my_table_name as a
where
a.id in (select id from another_table b where b.id = 1)
我的问题是,有什么办法可以避免 where 子句中的子查询并在 from 子句本身中使用它而不影响性能?
我有一个如下查询:
select
a.id, a.title, a.description
from
my_table_name as a
where
a.id in (select id from another_table b where b.id = 1)
我的问题是,有什么办法可以避免 where 子句中的子查询并在 from 子句本身中使用它而不影响性能?
到目前为止给出的两个答案在一般情况下都是不正确的(尽管数据库可能有独特的约束来确保它们在特定情况下是正确的)
如果another_table
可能有多个相同的行,id
那么INNER JOIN
将带回IN
版本中不存在的重复项。如果来自自己的列有重复,则尝试删除它们DISTINCT
可以改变语义。my_table_name
一般重写将是
SELECT a.id,
a.title,
a.description
FROM my_table_name AS a
JOIN (SELECT DISTINCT id
FROM another_table
WHERE id = 1) AS b
ON b.id = a.id
此重写的性能特征取决于实现。
您可以INNER JOIN
用作:
select
a.id, a.title, a.description
from
my_table_name as a INNER JOIN another_table as b ON (a.id = b.id and b.id = 1)
或者
select
a.id, a.title, a.description
from
my_table_name as a INNER JOIN another_table as b ON a.id = b.id
where b.id = 1
这两个查询可能不会为您返回相同的值。你可以选择任何适合你的。请将此作为起点,而不是作为复制粘贴代码。
将其表示为连接:
select distinct
a.id, a.title, a.description
from my_table_name as a
join another_table b on b.id = a.id
where b.id = 1
的用途distinct
是在 another_table 多次具有相同 id 的情况下产生相同的结果,因此不会多次返回同一行。
注意:如果 my_table_name 中的 id、name 和 description 的组合不是唯一的,则此查询不会像原始查询那样返回重复项。
为了保证产生相同的结果,您需要确保 another_table 中的 id 是唯一的。将此作为联接:
select
a.id, a.title, a.description
from my_table_name as a
join (select distinct id from another_table) b on b.id = a.id
where b.id = 1