SQL查询: find all devices that have ALL of the Ids passed in

标签 sql t-sql

我有两张 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/

相关文章:

sql - 如何跨多列和行 "Roll-Up"数据

sql - TSQL-无法解析 XML(命名空间)

sql-server - SQL Server CASE函数的不同格式

JOIN 表中的 MySql 查询排序

MySQL:将两个没有公共(public)ID的表合并在一起

sql-server - Sql where 子句在过滤器为空的情况下返回所有内容

用于查询的 XML 格式的 SQL Server 执行计划太大,无法完整显示或保存

mysql - Docker compose不执行.sql

mysql - MySQL 中的自动列值更新

php - 使用简单的 PDO 查询未将发布值输入数据库