我需要为报告编写SQL查询。用户可以选择六个动态过滤器,即用户可以选择一个或两个最多六个过滤器。
在每个过滤器中,用户从下拉列表中选择设备的属性,操作员及其用户需要输入的值。这构成了一个过滤器,例如:
AttributeName Operator Value
Cost equal 480
AND MappedName contains DummyString
这里“Cost”是属性,“480”是值,整个事物由一个过滤器组成。在类似的方式用户可以选择最大。 6个过滤器 两个过滤器之间的操作员也是动态的。它可以是“AND”或“OR”
在报告中,我需要为每个过滤器动态生成一列以及一些静态列,例如:设备名称,设备制造是静态列,而上述过滤器是动态的。
因此,当用户选择两个过滤器时,报告将类似于:
DeviceName DeviceManufactur Cost MappedName
D1 DM1 480 DummyString
D2 DM2 480 DummyString
在数据库中,属性存储如下:
DeviceName DeviceManufactur AttributeName AttributeValue
D1 DM1 Cost 480
D1 DM1 MappedName DummyString
D2 DM2 Cost 480
D2 DM2 MappedName DummyString
所以当我编写像
这样的简单sql时select d.name,d.manufacture,d.AttName,d.value
from Device d
where d.AttName='Cost' and d.AttValie='480'
and d.AttName='MappedName' and d.AttValue='DummyString'
虽然设备与这两个属性相关联,但它永远不会给我任何记录。
任何人都可以建议SQL的任何特定功能,这将有助于我有效地编写这个逻辑。
答案 0 :(得分:0)
我认为我没有理解你的问题,但我唯一能想到的是:
SELECT d.DeviceName, d.DeviceManufactur, d.AttributeName, d.AttributeValue
FROM aDevice d
WHERE d.DeviceName IN (
SELECT dd.DeviceName
FROM aDevice dd
WHERE EXISTS (SELECT 1 FROM aDevice ddd WHERE AttributeName='Cost' AND AttributeValue='480' AND ddd.DeviceName = dd.DeviceName)
AND EXISTS (SELECT 1 FROM aDevice ddd WHERE AttributeName ='MappedName' AND AttributeValue = 'DummyString' AND ddd.DeviceName = dd.DeviceName))
这应返回与查询Cost = '480' AND MappedName = 'DummyString'
...