2012-11-30 32 views
1

我有两个表,人(id,phonetype,phonenumber),phonetype(id,txtDisplay)。例如如何使用一个表中的数据作为列将两个表合并到一个表中?

Phonetye

Id txtDisplay 
1 Home Phone 
2 Work Phone 
3 Mobile Phone 

Id phonetype phonenumber 
0001 1  6310001111 
0001 2  6310001112 
0002 3  5160002113 
0003 2  7180003112 

结果表应该是

Id home_phone work_phone mobile_phone 
0001 6310001111 6310001112 
0002     5160002113 
0003   7180003112 

我如何写这样的查询?

+0

这是什么RDBMS? –

+3

@MahmoudGamal,假设任何人标记他们的问题'sql'正在谈论Microsoft SQL Server。微软喜欢假装通用词汇总是指他们的*产品。参看Microsoft Word,Microsoft Windows,Microsoft Money。 :-) –

+0

@BillKarwin - 有趣的是,这里有很多用户。 [这里是一个示例](http://stackoverflow.com/questions/13685394/sql-dynamic-date-comparison#comment18788200_13685394) –

回答

3

,如果你已经知道了所有的手机类型这只会工作:

SELECT 
    id, 
    max(case when phonetype=1 then phonenumber end) as home_phone, 
    max(case when phonetype=2 then phonenumber end) as work_phone, 
    max(case when phonetype=3 then phonenumber end) as mobile_phone 
FROM Person 
GROUP BY id 
2

在SQL中,列名必须在查询解析的时间是已知的。您不能编写一个查询,根据查找到的数据自动扩展列数。

你可以,但是这样做在两个查询:

  1. 首先,获取所有从PHONETYPE表中的不同电话号码的类型。

  2. 其次,编写代码添加尽可能多的列,因为您有不同的电话号码类型。

的Microsoft SQL Server支持PIVOT操作,有​​助于为这些类型的查询一点点,但你还是必须知道所有您要列不同的值。所以我上面的两步过程适用于Microsoft以及任何其他SQL实现。

相关问题