0

レポートの SQL クエリを作成する必要があります。ユーザーは動的な 6 つのフィルターを選択できます。つまり、ユーザーは 1 つまたは 2 つから最大 6 つのフィルターを選択できます。

各フィルターで、ユーザーはドロップダウンからデバイスの属性、演算子、およびユーザーが入力する必要があるその値を選択します。これは単一のフィルターを構成します。例:

     AttributeName  Operator    Value
     Cost           equal       480
AND  MappedName     contains    DummyString

ここで、「コスト」は属性で、「480」は値で、この全体が 1 つのフィルタで構成されています。同様の方法で、ユーザーは最大を選択できます。6 フィルター また、2 つのフィルター間の演算子も動的です。「AND」または「OR」を指定できます

レポートでは、いくつかの静的な列と共に各フィルターの列を動的に生成する必要があります。たとえば、デバイス名、デバイスの製造元は静的な列ですが、上記のフィルターは動的です。

したがって、ユーザーが 2 つのフィルターを選択した場合のレポートは次のようになります。

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の特定の機能を誰かが提案できますか?

4

1 に答える 1

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'...

于 2012-07-12T16:10:05.280 に答える