2013-05-15 62 views
2

我想用1个sql语句来产生我想要的结果。 我命名的,为了和客户2个表,并试图用这样的查询当存在不匹配的记录时加入两个表

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 ='内部')的所有订单和输出应由customers_name进行排序。

回答

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的清晰度。

第一个将“内部”的任何丢失的客户,第二个缺少客户通过增加未知的,如果客户ID不为0

+0

如果使用了左连接,如何为订单表添加更多条件,如order_date> = 5/01/2013? – user1515848

+0

哦,我明白了,谢谢你的快速回复 – user1515848

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; 
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; 

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

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”子句中加入连接条件会容易得多。

0

此方法使用UNION在查询过程中添加“客户0”行,然后它执行INNER JOIN。只有在LEFT JOIN不起作用时才使用它。您的order表显然没有customers的外键关系(否则您将无法获得customer_id0),因此LEFT 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; 
相关问题