Запрос SQL: найдите все устройства, в которых ВСЕ идентификаторы переданы в - PullRequest
2 голосов
/ 15 сентября 2011

У меня есть две таблицы.

Устройства

  • DeviceId
  • ИмяУстройства

и

DeviceAttribute

  • DeviceAttributeId
  • Attributeid
  • DeviceId

Теперь я пытаюсь написать запрос, в котором я передаю несколько идентификаторов атрибутов, и я хочу найти все устройства, в которых переданы ВСЕ идентификаторы.

Я передаю идентификаторы в виде XML, и затем я могу преобразовать эти данные во временную таблицу, каждый идентификатор которой находится в отдельной строке.

Итак, предположим, что все атрибуты, которые я хочу сопоставить, находятся в таблице -

CREATE TABLE #TempAttribute (AttributeId int)

Итак, я могу найти все устройства, которые имеют атрибуты 3,34 и 67

У меня есть запрос, который объединяет все идентификаторы атрибутов устройств в один столбец, но я не уверен, что это происходит в правильном направлении:

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

1 Ответ

3 голосов
/ 15 сентября 2011
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) ; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...