Объединить результаты в SQL - PullRequest
1 голос
/ 30 октября 2011

Я пытаюсь запросить DNN и получить два PropertyDefinitionID и два значения для каждого PropertyDefinitionID.Это код, который я сейчас использую, но не возвращает никаких результатов.

SELECT *
FROM vw_Users u
INNER JOIN UserRoles r ON u.UserID = r.UserID and r.RoleID = '4'
INNER JOIN UserProfile p ON u.UserID = p.UserID
WHERE (p.PropertyValue = 'b510dab0-8bf6-e011-84a9-00505691002c' AND
       p.PropertyDefinitionID = '47') AND
      (p.PropertyValue = 'True' AND
       p.PropertyDefinitionID = '48')
ORDER BY p.PropertyValue

Есть запись с PropertyDefinitionID = 47 и PropertyValue = 'b510dab0-8bf6-e011-84a9-00505691002c'.И есть также запись с PropertyDefinitionID = 48 и PropertyValue = 'True'.

Так что, если бы я разбил этот запрос на части, я бы получил для первого:

UserId  PropertyDefinitionID     PropertyValue
5   47                   eb03dde0-8bf6-e011-84a9-00505691002c

, а для второго:

UserId  PropertyDefinitionID     PropertyValue
5   48                   True

Но я быкак они должны быть в одном запросе или, по крайней мере, результаты будут объединены.Это возможно?И если да, то как в мире вы это делаете?

РЕДАКТИРОВАТЬ: Но я хочу вернуть результат, только если он имеет значение для PropertyDefinitionID = 47 и только если PropertyDefinitionID = 48 является истиной.Я хочу, чтобы оба критерия соответствовали.

Спасибо!

Ответы [ 4 ]

2 голосов
/ 30 октября 2011

Вы используете AND для всего.Вы должны использовать ИЛИ для разделения ваших условий.Как и в логических классах: AND - это пересечение того, что OR для объединения.

SELECT *
FROM vw_Users u
INNER JOIN UserRoles r ON u.UserID = r.UserID and r.RoleID = '4'
INNER JOIN UserProfile p ON u.UserID = p.UserID
WHERE (p.PropertyValue = 'b510dab0-8bf6-e011-84a9-00505691002c' AND p.PropertyDefinitionID = '47') OR
      (p.PropertyValue = 'True' AND p.PropertyDefinitionID = '48')
ORDER BY p.PropertyValue
2 голосов
/ 30 октября 2011

Использовать

WHERE (p.PropertyValue = 'b510dab0-8bf6-e011-84a9-00505691002c' AND
       p.PropertyDefinitionID = '47') OR /*<------------------- Changed*/
      (p.PropertyValue = 'True' AND
       p.PropertyDefinitionID = '48')

В ответ на комментарии.Чтобы получить пользователей, отвечающих обоим критериям, вы можете использовать.

SELECT u.*
FROM   vw_Users u
       INNER JOIN UserRoles r
         ON u.UserID = r.UserID
WHERE  r.RoleID = '4'
       AND u.UserId IN (SELECT UserID
                        FROM   UserProfile
                        WHERE  ( PropertyValue =
                                 'b510dab0-8bf6-e011-84a9-00505691002c'
                                 AND PropertyDefinitionID = '47' )
                                OR 
                               ( PropertyValue = 'True'
                                 AND PropertyDefinitionID = '48' )
                        GROUP  BY UserID
                        HAVING COUNT(DISTINCT PropertyDefinitionID) = 2)  

Должно быть понятно, как расширить это для произвольного числа условий.

1 голос
/ 30 октября 2011

ВНУТРЕННИЙ СОЕДИНИТСЯ в таблицу UserProfile дважды (см. Измененный код).

Один раз для условий PropertyDefinitionID = '47'
Еще раз для условий PropertyDefinitionID = '48'

Я бы также изменил SELECT * только на выбор конкретные поля вы хотите вернуть


SELECT 
* 
FROM       vw_Users u 
INNER JOIN UserRoles r 
        ON u.UserID = r.UserID 
       and r.RoleID = '4' 
INNER JOIN UserProfile p1 
        ON u.UserID = p1.UserID 
       and p1.PropertyValue = 'b510dab0-8bf6-e011-84a9-00505691002c'
       and p1.PropertyDefinitionID = '47'
INNER JOIN UserProfile p2 
        ON u.UserID = p2.UserID 
       and p2.PropertyValue = True
       and p2.PropertyDefinitionID = '48'
0 голосов
/ 30 октября 2011

Измените один из операторов AND на OR, например:

SELECT *
FROM vw_Users u
INNER JOIN UserRoles r ON u.UserID = r.UserID and r.RoleID = '4'
INNER JOIN UserProfile p ON u.UserID = p.UserID
WHERE (p.PropertyValue = 'b510dab0-8bf6-e011-84a9-00505691002c' AND

       p.PropertyDefinitionID = '47') OR    --HERE'S YOUR PROBLEM

      (p.PropertyValue = 'True' AND
       p.PropertyDefinitionID = '48')
ORDER BY p.PropertyValue
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...