6

我有一个如下查询:

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 子句本身中使用它而不影响性能?

4

3 回答 3

3

到目前为止给出的两个答案在一般情况下都是不正确的(尽管数据库可能有独特的约束来确保它们在特定情况下是正确的)

如果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 

此重写的性能特征取决于实现。

于 2013-06-14T09:15:10.910 回答
2

您可以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

这两个查询可能不会为您返回相同的值。你可以选择任何适合你的。请将此作为起点,而不是作为复制粘贴代码。

于 2013-06-14T07:31:08.790 回答
2

将其表示为连接:

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
于 2013-06-14T07:51:52.400 回答