2011-04-18 9 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 

私は受信トレイからSenderNumber列からベース、連絡先、地区、sub_districtや村から名前や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

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

+0

INNER JOINをLEFT JOINに変更するだけですべてのメッセージが表示されます。リンクされたテーブルに含まれていない電話番号のa.Nameとa.TypeはNULLになります – GordyD

関連する問題