在SQL中结合结果

时间:2011-10-29 21:36:19

标签: sql sql-server sql-server-2008 tsql

我正在尝试查询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 个答案:

答案 0 :(得分:2)

使用

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 :(得分:2)

你正在使用AND来做所有事情。您应该使用OR来区分您的条件。就像在逻辑类中一样: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 :(得分:1)

INNER加入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'

答案 3 :(得分:0)

将其中一个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