Множественное предложение WHERE для одинаковых столбцов в TSQL - PullRequest
1 голос
/ 28 марта 2012

Я пытаюсь запросить две таблицы, которые находятся в отношении 1-ко-многим. Что я сделал, так это создал представление, зная, что я могу получить несколько записей для первой таблицы.

Мой сценарий таков: у меня есть таблица «Предметы» и таблица «Свойства».

Таблица «Свойства» содержит столбцы ItemsId, PropertyId, PropertyValueId.

Таблица «Объекты» содержит список «Свойства».

Как бы я запросил это «Представление» так, чтобы я хотел получить все записи «Предметов», имеющие комбинацию значений «PropertyId» и «PropertyValueId».

Другими словами что-то похожее на:

WHERE
 (PropertyId = @val1 AND PropertyValueId = @val2) OR
 (PropertyId = @val3 AND PropertyValueId = @val4) OR
 (PropertyId = @val5 AND PropertyValueId = @val6)

Предложение WHERE - это просто цикл над коллекцией "Items.Properties".

«Предметы» представляет собой таблицу «Предметов», хранящихся в базе данных. Каждый элемент имеет некоторые динамические свойства, одно или несколько. Вот почему у меня есть еще одна таблица под названием «Свойства». Таблица свойств содержит столбцы: ItemId, PropertyId, PropertyValue

Объект "Item" имеет коллекцию Properties / Values. Проп1: Валь1, Проп2: Валь2 и т. Д.

Спасибо

Ответы [ 2 ]

0 голосов
/ 28 марта 2012

Я бы использовал такой запрос:

SELECT ItemId
FROM ItemView
WHERE (PropertyId = @val1 AND PropertyValueId = @val2)
   OR (PropertyId = @val3 AND PropertyValueId = @val4)
   OR (PropertyId = @val5 AND PropertyValueId = @val6)
GROUP BY ItemId
HAVING COUNT(*) = 3

Предложение WHERE такое же, как в вашем вопросе, оно позволяет выбирать строку только в том случае, если строка имеет соответствующее свойство. Вам нужно только дополнительно убедиться, что полученные элементы имеют все свойства в фильтре, что делается в приведенном выше запросе с помощью предложения HAVING: вы запрашиваете элементы с 3 конкретными свойствами следовательно, количество свойств для элемента в вашем наборе результатов (COUNT(*)) должно быть равно 3.

В более общем случае, когда количество запрашиваемых свойств может быть произвольным, вам, вероятно, следует рассмотреть возможность передачи аргументов в форме таблицы и присоединить к ней представление:

…
FROM ItemView v
  INNER JOIN RequestedProperties r ON v.PropertyId      = r.Id
                                  AND v.PropertyValueId = r.ValueId
GROUP BY v.ItemId
HAVING COUNT(*) = (SELECT COUNT(*) FROM RequestedProperties)
0 голосов
/ 28 марта 2012

Возможно, я не понял вашего требования (несмотря на обновление) - если этот или любой другой ответ не решит проблему, добавьте несколько примеров данных для элементов, свойств и выходных данных, а затем, надеюсь, все станет ясно.

Если Items - это спецификация пар имя-значение свойства, которые вам нужны (и не имеет ничего общего с ItemId для свойств, что кажется странным ...)набор элементов, имеющих одно (и только одно) значение свойства для каждого свойства, определенного в элементах.Вы можете положить количество элементов в переменную, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...