存在不匹配记录时连接两个表

时间:2013-05-15 14:05:40

标签: mysql sql

我正在尝试使用1 sql语句来生成我想要的结果。 我有两个名为,订单和客户的表,并试图使用像这样的查询

select a.*, b.customers_name 
from order a, customers b 
where a.customers_id=b.customers_id   
order by b.customers_name;

我的问题是订单表中有假的customers_id,如果customers_id = 0那么 customers_name ='内部',在cumstomers表中不存在。 在我加入这家公司之前,它已被这样使用,所以我根本无法修改表格。

有没有办法显示结果? 订单表中的所有订单都包含customers_name,如果customers_id = 0(< =客户表中没有匹配记录),那么customers_name ='In House')和输出应按customers_name排序。

5 个答案:

答案 0 :(得分:2)

select a.*,
        COALESCE(b.customers_name, 'In House') as customers_name
from
    order a LEFT JOIN customers b ON a.customers_id=b.customers_id
order by
    customers_name;

select a.*,
         CASE
           WHEN a.customers_id = 0 THEN 'In House'
           WHEN b.customers_name IS NULL THEN 'Unknown'
           ELSE b.customers_name
         END as customers_name
from
    order a LEFT JOIN customers b ON a.customers_id=b.customers_id
order by
    customers_name;

无论哪种方式,都要使用明确的JOIN来清晰。

第一个为任何缺少的客户添加“内部”,第二个通过添加未知来处理缺少的客户,如果customerid不是0

答案 1 :(得分:1)

您应该可以使用LEFT JOIN

select a.*, b.customers_name
from order a
left join customers b
on a.customers_id = b.customers_id
order by b.customers_name;

答案 2 :(得分:1)

select a.*, IFNULL(b.customers_name, 'In House')
from order a
LEFT JOIN customers b ON a.customers_id=b.customers_id   
order by b.customers_name;
嘿,我们在这里得到了相同的答案......

答案 3 :(得分:0)

一个选项:

select a.*, case when a.customers_id=0 then 'In House' else b.customers_name end as customers_name
from order a
left join customers b on b.customers_id=a.customers_id;

BTW我建议你使用“join”语法。阅读更容易,然后将连接条件放在“where”子句中。

答案 4 :(得分:0)

此方法使用UNION在查询期间添加“customer 0”行,然后执行INNER JOIN。仅在LEFT JOIN不起作用时使用它。您的order表显然与customers没有外键关系(否则您将无法拥有customer_id 0),因此{ {1}}可能会捡到一些垃圾;你必须做出判断。

LEFT JOIN
相关问题