2011-04-18 73 views
2

我有这个表:从多个表中的电话号码获取姓名?

inbox table 
SenderNumber Message 

contact table 
Name Number 

district table 
id SpvName Number 

sub_district table 
id district_id SpvName Number 

village table 
id sub_district_id SpvName Number 

我想从接触,区,sub_district或村庄,从收件箱中的SenderNumber列基于名称或spvname。我如何实现这一目标?结果这

SenderNumber | Name | Type   | Message 
-------------+------+--------------+------------ 
123   | john | contact  | bla bla 
234   | mary | district spv | bla bla bla 

在此先感谢和抱歉我的英文不好,也许等。

回答

3
SELECT i.SenderNumber, 
     COALESCE(c.Name, d.SpvName, sd.SpvName, v.SpvName) as Name, 
     CASE WHEN c.Name IS NOT NULL THEN 'contact' 
      WHEN d.SpvName IS NOT NULL THEN 'district' 
      WHEN sd.SpvName IS NOT NULL THEN 'sub_district' 
      WHEN v.SpvName IS NOT NULL THEN 'village' 
      ELSE '' 
     END AS Type, 
     i.Message 
    FROM inbox i 
     LEFT JOIN contact c 
      ON i.SenderNumber = c.Number 
     LEFT JOIN district d 
      ON i.SenderNumber = d.Number 
     LEFT JOIN sub_district sd 
      ON i.SenderNumber = sd.Number 
     LEFT JOIN village v 
      ON i.SenderNumber = v.Number 
+0

谢谢,这是我需要的,但是,我不知道我们如何使它更快吗?查询大概需要0.780秒。我有这些数量的每个表的记录: 收件箱:227 接触:36 区:11 sub_district:154 村:1767个 – dieehard 2011-04-19 10:03:01

0

像这样的工作,我相信......

SELECT i.SenderNumber, a.Name, a.Type, i.Message FROM 
inbox i 
INNER JOIN 
(SELECT SpvName as Name, 'contact' as Type, Number FROM contact 
UNION 
SELECT SpvName as Name, 'sub district' as Type, Number FROM sub_district 
UNION 
SELECT SpvName as Name, 'district' as Type, Number FROM district 
UNION 
SELECT SpvName as Name, 'village' as Type, Number FROM village 
) a 
ON i.SenderNumber = a.Number 
+0

感谢,你的答案,这比以前的答案更快,因为它只显示所有消息即连接表中列出的电话号码。我需要显示所有消息。 – dieehard 2011-04-19 10:05:07

+0

您只需将INNER JOIN更改为LEFT JOIN即可显示所有消息。未包含在链接表中的电话号码的a.Name和a.Type将为NULL – GordyD 2011-04-19 11:24:34

相关问题