SQL左联接查询,其中where子句从第一个表中删除了一些行

时间:2018-09-06 18:50:52

标签: sql sql-server left-join

我有两个表mobile和company,我想显示移动详细信息及其相应的公司名称。我正在尝试此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 join查询。嗯

3 个答案:

答案 0 :(得分:0)

您需要将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_category在示例数据中为b


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

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

答案 1 :(得分:0)

您不应在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

如果在条件中使用左联接列,则此联接将作为内部联接..

答案 2 :(得分:0)

您的预期结果将永远不会发生,因为在这种情况下,supplier_id = 1 and c.company_category = A将不会返回任何内容。也许您的方案是错误的,或者只是删除最后一个子句:... and c.company_category = 'A'以得到预期的结果。

一种选择是尝试这样的事情:

SELECT * 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