首先,我對模糊的標題表示歉意。我有兩個表:Devices和DeviceProperties。
[ Devices ]
[ id ]
[ AA ]
[ BB ]
[ CC ]
[ DeviceProperties ]
[ id ][ propertyType ][ propertyKey ][ valueType ][ value ]
[ AA ][ desired ][ scanInterval ][ Number ][ 100 ]
[ AA ][ tag ][ floor ][ Number ][ 200 ]
[ AA ][ desired ][ name ][ String ][ AA_Device ]
[ BB ][ desired ][ scanInterval ][ Number ][ 100 ]
[ BB ][ tag ][ floor ][ Number ][ 200 ]
[ CC ][ tag ][ floor ][ Number ][ 200 ]
我想選擇所有具有特定設備屬性的設備:
-- Select devices that have these DeviceProperties
[ desired ][ scanInterval ][ Number ][ 100 ]
[ tag ][ floor ][ Number ][ 200 ]
我宣告了N 個變數。每組 4 個宣告的變數代表 DeviceProperties 表中的不同設備屬性/行。
DECLARE @propertyType_1 nvarchar(max) = 'desired';
DECLARE @propertyKey_1 nvarchar(max) = 'scanInterval'
DECLARE @valueType_1 nvarchar(max) = 'Number'
DECLARE @value_1 nvarchar(max) = '100'
-- [ desired ][ scanInterval ][ Number ][ 100 ]
DECLARE @propertyType_n nvarchar(max) = 'tag';
DECLARE @propertyKey_n nvarchar(max) = 'floor'
DECLARE @valueType_n nvarchar(max) = 'Number'
DECLARE @value_n nvarchar(max) = '200'
-- [ tag ][ floor ][ Number ][ 200 ]
假設我有一個有效的查詢,它只會回傳以下設備:
[ Devices ]
[ id ]
[ AA ]
[ BB ]
Device CC 不會被回傳,因為它只有 DeviceProperty
[ tag ][ floor ][ Number ][ 200 ]
但不是
[ desired ][ scanInterval ][ Number ][ 100 ]
我真的很困惑我應該寫什么樣的查詢。簡單的 WHERE 查詢在這里不起作用。
uj5u.com熱心網友回復:
在臨時表中插入所需的匹配條件
insert into #temp (propertyType, propertyKey, valueType, value)
values ('desired', 'scanInterval', 'Number', 100),
('tag', 'floor', 'Number', 200);
將其加入您的表,GROUP BY id并且匹配行的計數必須為N. 對于給出的例子,N = 2
SELECT d.id
FROM Devices d
INNER JOIN DeviceProperties p ON d.id = p.id
INNER JOIN #temp t ON p.propertyType = t.propertyType
AND p.propertyKey = t.propertyKey
AND p.valueType = t.valueType
AND p.value = t.value
GROUP BY d.id
HAVING COUNT(*) = 2
uj5u.com熱心網友回復:
松鼠給了我一個主意。不確定這是否是一種理想的方法,但我也可以這樣做:
select
d.deviceId
from
Devices as d
join
DeviceProperties as p
on
d.deviceId = p.deviceId
where
p.propertyType in (@pt_0, @pt_1) and
p.propertyKey in (@pk_0, @pk_1) and
p.value in (@pv_0, @pv_1)
group by
d.deviceId
having
COUNT(*) = 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/384651.html
標籤:sql sql-server 查询语句
上一篇:從電話號碼中洗掉尾隨零
下一篇:在作業中運行存盤程序的性能影響
