我有两张 table 。
设备
- 设备ID
- 设备名称
和
设备属性
- DeviceAttributeId
- 属性ID
- 设备ID
现在,我尝试编写一个查询,在其中传递一些属性 Id,并且我想查找传递了所有 Id 的所有设备。
我将 Id 作为 XML 传递,然后我能够将此数据转换为临时表,其中每个 Id 都位于其自己的行中。
所以,此时,假设我想要匹配的所有属性都在一个表中 -
创建表#TempAttribute(AttributeId int)
因此,我可能想查找 attributeId 为 3,34 和 67 的所有设备
我有一个查询,它将所有设备属性 ID 连接到一列中,但我不确定这是否朝着正确的方向进行:
SELECT deviceID
, [Name]
, (SELECT CAST(cast(attributeID as varchar(10)) + ', ' AS VARCHAR(MAX))
FROM deviceattribute
WHERE (deviceID = device.deviceID)
order by attributeID
FOR XML PATH ('')
) AS attribs
FROM device
最佳答案
DECLARE @NumberOfAttributes INT;
INSERT INTO #TempAttribute
SELECT DISTINCT .... /* Rest of your XML query*/
SET @NumberOfAttributes= @@ROWCOUNT;
SELECT DeviceId,
DeviceName
FROM Devices
WHERE DeviceId IN (SELECT DeviceId
FROM DeviceAttribute da
JOIN #TempAttribute ta
ON da.Attributeid = ta.Attributeid
GROUP BY DeviceId
HAVING COUNT(*) = @NumberOfAttributes) ;
关于SQL查询: find all devices that have ALL of the Ids passed in,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7433356/