2

我正在尝试使用 1 条 sql 语句来产生我想要的结果。我有 2 个名为 、 order 和 customers 的表,并尝试使用这样的查询

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='In House',在cumstomers 表中不存在。在我加入这家公司之前一直是这样使用的,所以我根本无法修改表格。

有没有办法显示结果?带有customers_name 的订单表中的所有订单,如果customers_id=0(<=customers 表中没有匹配记录)则customers_name='In House')和输出应按customers_name 排序。

4

5 回答 5

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。

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

于 2013-05-15T14:09:01.447 回答
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;
于 2013-05-15T14:10:00.267 回答
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;

嘿,我们都在这里得到了相同的答案......

于 2013-05-15T14:10:01.760 回答
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;

顺便说一句,我建议您使用“加入”语法。将连接条件放在“where”子句中会更容易阅读。

于 2013-05-15T14:11:38.050 回答
0

此方法用于UNION在查询期间添加“客户 0”行,然后执行INNER JOIN. 仅当 aLEFT JOIN不起作用时才使用它。您的order表显然没有外键关系customers(否则您将无法拥有customer_idof 0),因此 aLEFT JOIN可能会捡起一些垃圾;您必须对此做出判断。

select a.*, b.customers_name
from order a
INNER JOIN (
  SELECT customers_id, customers_name
  FROM customers
  UNION SELECT 0, 'In House') b ON a.customers_id=b.customers_id
order by b.customers_name;
于 2013-05-15T14:14:15.150 回答