我需要问一些关于连接的真正令人困惑的事情
我的想法,我确信这过去对我有用,但似乎缺少一些东西:
此查询导致来自两个表的数据,其中 client_id 为 1 - 工作正常
/* gets data for one client_id*/
approach 1A
SELECT *
FROM clients LEFT JOIN client_modules
ON client_modules.client_id = clients.client_id
WHERE clients.client_id = 1;
现在,我认为这个查询应该返回相同的结果,因为我在连接中使用了子查询来首先过滤结果,即。已经从 client_id 1 的模块中获取数据,但是由于某种原因,它在最终结果中提供了其他 client_ids 数据。
/* gets data for one client_id sub-query approach*/
approach 2A
SELECT *
FROM clients LEFT JOIN (SELECT client_id, module_name
FROM client_modules
WHERE client_modules.client_id = 1)
AS client_moduless ON client_moduless.client_id = clients.client_id;
/* gets data for all client_ids */
approach 1B
SELECT * FROM clients
LEFT JOIN client_modules ON client_modules.client_id = clients.client_id;
/* gets data for all client_ids*/
approach 2B
SELECT *
FROM clients LEFT JOIN (SELECT client_id, module_name
FROM client_modules) AS client_moduless
ON client_moduless.client_id = clients.client_id;
问题:
1)在处理大量数据时,哪种方法更有效xA and xB
?
2)为什么第二种方法2A
会给出结果client_ids other then 1
,尽管在 join 中单独运行子查询可以正常工作
3) 如果不使用 where 子句,子查询是否会2B
针对父项的每条记录执行?
4)如果我将 1A 查询更改为
SELECT * FROM clients
JOIN client_modules ON client_modules.client_id = clients.client_id AND client_modules.client_id = 1
刚刚删除了客户端表上的 where 子句并将其放在子表上的 join 子句中,这是有效的还是 where 子句?
问候