SQL 左联接查询与 Where 子句从第一个表中删除一些行



我有两个移动和公司表,我想显示移动详细信息及其相应的公司名称。我正在尝试这个 SQL 左连接查询。

SELECT m.*,c.company_name 
FROM mobile m 
LEFT JOIN company c 
ON m.mobile_id=c.mobile_id 
WHERE supplier_id=1 
AND c.company_category=A

公司桌子很大,所以我必须 在查询中使用company_category否则会花费大量时间。

以下是表格详细信息:

移动-

supplier_id mobile_name  mobile_color     mobile_id
-------------------------------------------------
1           Moto         Red            4324234234234
1           Xperia       Black          43332
1           Gold         Black          2342332423433
2           Smart        White          2342342342342
2           Jam          Red            32233
3           Champ        Red            2342342342343

公司-

company_category          mobile_id           company_name    
-------------------------------------------------------
B                     4324234234234           Samsung           
A                     2342342342342           Apple        
A                     67                      Sony  

预期输出-

supplier_id mobile_name  mobile_color     mobile_id        Company_name
-------------------------------------------------
1           Moto         Red            4324234234234    Samsung
1           Xperia       Black          43332             NULL
1           Gold         Black          2342332423433     NULL

但是我得到了这个输出。它从移动表中删除两行

supplier_id mobile_name  mobile_color     mobile_id        Company_name
----------------------------------------------------------------------
1           Moto         Red            4324234234234    Samsung

请建议任何替代的 sql 连接查询。

您不应该在 where 子句 (c.company_category=A ( 中使用左连接表列 尝试将条件添加到 ON 子句

select m.*
,c.company_name 
from mobile m 
left join company c on m.mobile_id=c.mobile_id  
AND  supplier_id=1 
and c.company_category=A

如果在 where 条件下使用左连接列,则将其用作内部连接..

您需要将where条件移动到join。 照原样,它否定了outer join

select m.*,c.company_name 
from mobile m 
left join company c on m.mobile_id=c.mobile_id 
and c.company_category='A'
where m.supplier_id=1 

但是,这不会给您带来samsung,因为它的company_categoryb在示例数据中。


根据您的评论,这不会解决您遇到的任何性能问题,只需返回缺少的行即可。 相反,您应该查看您的execution plan并确保在两个表上都有适当的indices。 我建议如下:

mobile (mobile_id, supplier_id)
company (mobile_id, company_category)

您的预期结果永远不会包含:

因为supplier_id = 1 and c.company_category = A在这个塞纳里奥什么也回不来。

也许你的cenario是错误的,或者只是删除你最后的幽闭以获得预期的结果:

... and c.company_category = 'A'

一种替代方法是尝试这样的事情:

SELECT m.*, c.company_name FROM mobile m 
LEFT JOIN company c ON m.mobile_id = c.mobile_id 
WHERE supplier_id = 1 
AND (c.company_category = 'A' OR c.company_category IS NULL)

现场示例:http://sqlfiddle.com/#!9/187ead/13

最新更新