2011-08-08 112 views
1

我一直停留在查询中有一个CUSTOMERPHONE表。TSQL查询问题

这是一个一对多的关系,其中CUSTOMER,并有许多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 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; 

完整外部联接将选择客户既具有移动和办公室电话,或者只用一个而不是其他。如果您还不想列出客户,则需要稍微不同的查询(并需要引用客户表)。

请注意,这不会从客户表中选择;我假设Phone表中没有Customer表中没有客户ID值(因此您有正确的参照完整性约束)。