我有两个表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查询。嗯
答案 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)