2011-08-08 13 views
1

CUSTOMERPHONEというテーブルがあるクエリでは悩まされています。TSQLクエリの問題

それは中CUSTOMER多くの関係1、であり、多くのPHONE番号

テーブルを持って、次のようなものです:

---CUSTOMER--- 
cust_ID 
cust_Name 

---PHONE--- 
cust_ID 
Phone_type (M or O for mobile/office respectively) 
phone_no 

私は、出力は次のようになり、クエリを作成したいです次のような:

cust_name | M_Phone | O_Phone 

M_Phoneは、携帯電話番号があるとO_Phoneは、オフィスの番号です。

答えて

3
select C.cust_Name, 
     PM.phone_no as M_Phone, 
     PO.phone_no as O_Phone 
from CUSTOMER as C 
    left outer join @PHONE as PM 
    on C.cust_ID = PM.cust_ID and 
     PM.phone_no = 'M' 
    left outer join PHONE as PO 
    on C.cust_ID = PO.cust_ID and 
     PO.phone_no = 'O' 

上記のクエリを使用すると、電話番号のない顧客も表示されます。 実際に電話を持っている顧客だけにこのwhere句を追加したい場合。

where PM.phone_no is not null or 
     PO.phone_no is not null 
+0

チャームのように働いた –

0

一部のDBMSで、これは動作します:

SELECT M.Cust_ID, M.Phone_No AS M_Phone, O.Phone_No AS O_Phone 
    FROM (SELECT Cust_ID, Phone_No FROM Phone WHERE Phone_Type = 'M') AS M 
    FULL OUTER JOIN 
     (SELECT Cust_ID, Phone_No FROM Phone WHERE Phone_Type = 'O') AS O 
    ON M.Cust_ID = O.Cust_ID; 

FULL OUTERは、携帯電話やオフィスの電話、または一つだけではなく、他のとの両方を顧客に選択されます参加します。また、顧客をリストしたくない場合は、少し異なるクエリが必要になります(また、Customerテーブルを参照する必要があります)。

これはCustomerテーブルから選択しないことに注意してください。 PhoneテーブルにCustomerテーブルにも存在しないCustomer ID値がない(正しい参照整合性制約が設定されているため)と想定しています。