我正在尝试使用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排序。
答案 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