我有一个如下所示的查询:
SELECT *
FROM employees e
LEFT JOIN
(
SELECT *
FROM timereports
WHERE date = '2009-05-04'
) t
ON e.id = t.employee_id
如您所见,我的 LEFT JOIN
第二个表参数是由子查询生成的。
数据库是只评估这个子查询一次还是多次?
谢谢。 马蒂
最佳答案
这取决于 RDBMS
。
在大多数情况下,将采用HASH OUTER JOIN
,在这种情况下子查询将被评估一次。
MySQL
无法创建 HASH JOIN
,这就是为什么它很可能会将谓词插入子查询并发出这个查询:
SELECT *
FROM timereports t
WHERE t.employee_id = e.id
AND date = '2009-05-04'
在嵌套循环中。如果您在 timereports (employee_id, date)
上有索引,这也会很有效。
关于sql - LEFT JOIN 子查询表参数是否被多次评估?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/852007/