动态sql数据透视表
我希望你能帮助我解决我们的这项任务 最初我们有以下表格:动态sql数据透视表,sql,dynamic,pivot,entity-attribute-value,Sql,Dynamic,Pivot,Entity Attribute Value,我希望你能帮助我解决我们的这项任务 最初我们有以下表格: hwtype id name 1 router 2 switch hwelement id idhwtype name 1 1 RTR1 2 1 RTR2 3 2 SWT1 hwattributes id idhwtype name 1 1 speed 2 1 IP 3 2 ports hwtyp
hwtype
id name
1 router
2 switch
hwelement
id idhwtype name
1 1 RTR1
2 1 RTR2
3 2 SWT1
hwattributes
id idhwtype name
1 1 speed
2 1 IP
3 2 ports
hwtypeattributes
id idhwelement idhwattribute value
1 1 1 100mb
2 1 2 172.16.3.23
3 2 1 10mb
4 2 2 172.16.3.26
5 3 3 8
我们现在需要的是一个以这种方式显示数据的函数(根据hwtype)
对于hwtype.name=路由器
element speed IP
RTR1 100mb 172.16.3.23
RTR2 10mb 172.16.3.26
其思想是使表能够包含新的元素类型、元素和属性,而无需修改表编码
我一直在寻找例子,但不幸的是,我发现了一些好的东西,它们聚集在价值上,这是我没有考虑过的。
提前感谢您的帮助您正在使用EAV反模式。这打破了关系数据库设计的各种规则,正如您所发现的,将数据取出是非常尴尬的。这种设计还有许多其他的弱点,在其他地方也提到过 阅读文章“”了解EAV系统如何摧毁一家公司的伟大故事 以下是从数据库中获取路由器属性所需执行的操作:
SELECT e.name AS "element",
speedval.value AS "speed",
ipval.value AS "IP",
portsval.value AS "Ports"
FROM hwtype t
JOIN hwelement e ON (e.idhwtype = t.id)
JOIN hwattributes speed ON (speed.idhwtype = t.id AND speed.name = 'speed')
LEFT OUTER JOIN hwtypeattributes speedval
ON (speedval.idhwattribute = speed.id AND speedval.idhwelement = e.id)
JOIN hwattributes ip ON (ip.idhwtype = t.id AND ip.name = 'ip')
LEFT OUTER JOIN hwtypeattributes ipval
ON (ipval.idhwattribute = ip.id AND ipval.idhwelement = e.id)
JOIN hwattributes ports ON (ports.idhwtype = t.id AND ports.name = 'ports')
LEFT OUTER JOIN hwtypeattributes portsval
ON (portsval.idhwattribute = ports.id AND portsval.idhwelement = e.id)
WHERE t.name = 'router';
请注意,如果坚持在一行上获取给定元素的所有属性,则每个属性都需要一对额外的联接。对于SQL优化器来说,这很快就会变得非常昂贵
获取多行上的属性并在应用程序代码中进行排序要容易得多:
SELECT e.name AS "element", a.name, v.value
FROM hwtype t
JOIN hwelement e ON (e.idhwtype = t.id)
JOIN hwattributes a ON (a.idhwtype = t.id)
JOIN hwtypeattributes v ON (v.idhwattribute = a.id AND v.idhwelement = e.id)
WHERE t.name = 'router';
当询问有关SQL的问题时,请确保标记您使用的RDBMS品牌。例如,
sql server
,oracle
,mysql
,等等。答案很重要。您不是第一个梦想使用实体值体系结构实现无需更改数据库的系统的人。不幸的是,你可能也不会最后诅咒这个决定:(如果改变架构还不算太晚,你应该考虑一下。