Где предложение в объединенной таблице, используемое для определяемых пользователем пар ключ / значение - PullRequest
3 голосов
/ 15 апреля 2010

Наше приложение позволяет администраторам добавлять «Свойства пользователя», чтобы они могли адаптировать систему под свои собственные системы управления персоналом. Например, если в вашей компании есть отделы, вы можете определить «Отделы» в таблице «Свойства», а затем добавить значения, соответствующие «Отделам», такие как «Ювелирные изделия», «Электроника» и т. Д. Затем вы сможете назначить отдел пользователям .

Вот схема: Схема http://www.mindgravy.net/wp-content/uploads/2010/04/image.png

В этой схеме пользователь может иметь только одно UserPropertyValue для каждого свойства, но ему не обязательно иметь значение для свойства.

Я пытаюсь создать запрос, который будет использоваться в SSRS 2005, а также использовать PropertyValues ​​в качестве фильтра для пользователей. Мой запрос выглядит так:

SELECT UserLogin, FirstName, LastName
FROM Users U
LEFT OUTER JOIN UserPropertyValues UPV
    ON U.ID = UPV.UserID
WHERE UPV.PropertyValueID IN (1, 5)

Когда я запускаю это, если у пользователя есть ЛЮБОЕ из значений свойств, они возвращаются. Я хотел бы, чтобы этот запрос возвращал пользователей со значениями BY PROPERTY.

Таким образом, если PropertyValueID = 1 относится к Отделу (Ювелирные изделия), а PropertyValueID = 5 относится к EmploymentType (Полная занятость), я хочу вернуть всех пользователей, которые находятся в Отделе украшений и имеют статус EmployeeType полного времени, можно ли это сделать? <Ч /> Вот полный пример данных:

  • Пользователь A имеет Department (Ювелирное значение = 1) и EmploymentType (значение FullTime = 5)
  • Пользователь B имеет Department (Электронное значение = 2) и EmploymentType (FullTime значение = 5)
  • У пользователя C есть Department (ювелирное значение = 1) и EmployementType (PartTime value = 6)

Мой запрос должен возвращать пользователя А только с использованием вышеуказанного запроса

UPDATE:

Я должен заявить, что этот запрос используется в качестве набора данных в SSRS, поэтому переданный в запрос параметр будет @PropertyIDs и определен как многозначный параметр в SSRS.

WHERE UPV.PropertyValueID IN (@PropertyIDs)

Ответы [ 4 ]

1 голос
/ 15 апреля 2010

Я разобрался, как заставить это работать совершенно хакерским способом:

SELECT UserLogin, FirstName, LastName
FROM Users
LEFT OUTER JOIN 
(
    SELECT UserID
    FROM UserPropertyValues 
    WHERE PropertyValueID IN (@PropertyIDs)
    GROUP BY UserID
    HAVING COUNT(UserID) = 
        (
            SELECT COUNT(*) FROM 
            (
            SELECT PropertyID FROM PropertyValues 
            WHERE ID IN (@PropertyIDs) GROUP BY PropertyID
            ) p
        )   
) filtered on Users.UserID = filtered.UserID

Поскольку мы можем определить количество свойств, используемых в параметре @PropertyIDs (возвращаемом счетчиком выбора (*)), мы можем убедиться, что у пользователей, возвращенных из запроса, будет то же количество свойств, что и в @ PropertyIDs.

0 голосов
/ 15 апреля 2010

Вам необходимо присоединиться к хранилищу key_value отдельно для каждого свойства, которое вы хотите получить (2 свойства, 2 объединения, 100 свойств, 100 объединений), поэтому это плохой выбор дизайна для производительности.

0 голосов
/ 15 апреля 2010

Расширение ответа OrbMan. Это даст вам по одной строке на пользователя / свойство.

SELECT U.UserLogin, U.FirstName, U.LastName, P.Name AS PropertyName, PV.Name AS PropertyValue
FROM Users U
INNER JOIN UserPropertyValues UPV
ON U.ID = UPV.UserID
INNER JOIN Properties P
ON UPV.PropertyID = P.ID
INNER JOIN PropertyValues PV
ON UPV.PropertyID = PV.ID
where UserID in ( 
    select UserID
    from UserPropertyValues upv1
    inner join UserPropertyValues upv2 on upv1.UserID = upv2.UserID 
        and upv1.PropertyValueID IN (@PropertyIDs))
0 голосов
/ 15 апреля 2010
SELECT UserLogin, FirstName, LastName 
FROM Users 
where UserID in ( 
    select UserID
    from UserPropertyValues upv1
    inner join UserPropertyValues upv2 on upv1.UserID = upv2.UserID 
        and upv1.PropertyValueID = 1 and upv2.PropertyValueID = 5
) a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...