2

我想知道这两个版本的结果是否相同,出于性能原因哪个更好,为什么?选择版本中的嵌套选择

select 
 t1.c1, 
 t1.c2, 
 (select Count(t2.c1) from t2 where t2.id = t1.id) as count_t 
from 
 t1 

VS

select t1.c1,t1.c2, Count(t2.c1)
from t1,t2
where t2.id= t1.id
4

3 回答 3

4

第一个查询类似于此查询 -

SELECT
  t1.c1,
  t1.c2,
  COUNT(t2.c1)
FROM t1
  LEFT JOIN t2
    ON t2.id = t1.id;

它从第一个表中选择所有记录,并从第二个表中选择所有匹配的记录(它是LEFT JOIN条件)。

第二个是这个查询的模拟 -

SELECT
  t1.c1,
  t1.c2,
  COUNT(t2.c1)
FROM t1
  JOIN t2
    ON t2.id = t1.id;

它只选择两个表中的匹配记录(它是INNER JOIN条件)。

于 2013-02-25T08:57:37.570 回答
2

好吧,它们是不同的查询。如果表 t2 中没有匹配的 id,则顶部将选择 t1 中返回 0 的所有行作为计数。

第二个查询将只返回 t1 和 t2 都具有相同 id 的行的行。

于 2013-02-25T08:56:59.973 回答
0

第一个查询可能会遇到大型数据集的性能问题。第二个查询可能存在笛卡尔问题。如果表 2 没有相关记录,我会根据您的意图使用连接或左连接来获取表 1 中的记录,然后添加一个 group by 语句来控制笛卡尔。

于 2013-02-25T09:04:04.183 回答