我有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
如果我不能很好地解释这一点,我道歉,但这可能就是为什么我很难找到类似的例子。任何帮助将不胜感激!
答案 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 question或this one,它们涉及完全相同的主题 - 动态SQL。