使用查找表值作为列的SQL查询

时间:2014-03-12 16:00:41

标签: sql sql-server-2008 join subquery cross-reference

我有3个表:Device,Service,DeviceXService

表(设备)具有与设备关联的设备和字段列表,例如序列号设备名称等。

DeviceID | Device Name | SerialNumber
1        | iPhone      | 2352532533
2        | iPad        | 2345435435
3        | android     | 2532532656

表(服务)是一个查找表,其中包含可在电子邮件,互联网,短信等设备上使用的服务列表。

ServiceID  | ServiceName
1          | email
2          | internet
3          | texting

表(DeviceXService)是一个交叉引用表,其中包含将设备链接到服务的记录以及这些设备的状态。

例如。

DeviceID    | ServiceID   | Status
--------------------------------------
1(iPhone)   | 1(email)    | requested
2(ipad)     | 2(internet) | Approved
1(iPhone)   | 3(texting)  | Approved
3(android)  | 3(texting)  | approved

我想要做的是创建一个查询,它将从Devices表返回所有设备,但也为Service表中存在的每种服务类型创建一个列,并返回每个服务的状态对于每个设备,将DeviceXService交叉引用表作为一个表。

示例:

Device ID | Device Name | Device Serial No | email    |  texting   |  internet
--------------------------------------------------------------------------------
    1     | iphone      | 2352532533       | requested|  approved  |  null
    2     | ipad        | 2345435435       | null     |  null      |  approved
    3     | android     | 2532532656       | null     |  null      |  approved

注意:如果设备在DeviceXService交叉引用表中没有该服务的记录,则为null

如果我不能很好地解释这一点,我道歉,但这可能就是为什么我很难找到类似的例子。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

如果Service表中的行数是常量且已知,则可以这样做:

select
 d.*,
 (select status from DeviceXService where Device_id=d.DeviceID and ServiceID=1) as email,
 (select status from DeviceXService where Device_id=d.DeviceID and ServiceID=2) as texting,
 (select status from DeviceXService where Device_id=d.DeviceID and ServiceID=3) as internet
from
 device d;

结果如下:

 id |  name   | serial | email | texting | internet 
----+---------+--------+-------+---------+----------
  1 | iphone  | 123    | req   | app     | 
  2 | ipad    | 234    |       |         | app
  3 | android | 345    |       |         | app
(3 rows)

如果您希望它是动态的,您可以根据代码中的服务表中的数据生成此类查询,然后针对数据库运行它。

如果您可以在代码中更简单地执行此操作,那么我不会像通过SQL查询将行转置到列一样。

修改

您可以查看this questionthis one,它们涉及完全相同的主题 - 动态SQL。