SQL选择多个外键

时间:2014-06-24 12:59:03

标签: sql sql-server join

我正在努力研究如何让这个SELECT以我想要的方式工作。

我有一个UserProfile表和一个用户之间的关系表。

UserProfile

Id              Name       IsPulic
----------------------------
1               Tom        1
2               Adam       1
3               Harry      0
4               Billy      0

Relationships

Id              UserId     RelationId   Confirmed
-------------------------------------------------
     1          1          2            1
     2          2          3            1
     3          3          4            1

我正在尝试让所有Adams朋友(以及其他表中的其他数据都是为了简洁而遗漏)但我似乎无法正确理解语法。

SELECT 
    up.[Id],
    up.[DisplayName],
    up.[IsPublic]
FROM
    [UserProfile] up
    INNER JOIN [Relationships] rel1 ON rel1.UserId = up.[Id]
    INNER JOIN [Relationships] rel2 ON rel2.RelationId = up.[Id]
WHERE
    rel1.[UserId ] = 2 OR rel2.[RelationId] = 2

我在这种情况下看到的大多数示例翻转了表格,但后来我有多个引用来从UserProfile表中获取我想要的数据。

我想要的是与Adam有关系的用户列表(Id - 2),这样就会产生一个Harry(通过RelationId外键)和Tom(通过UserId外键)的列表。

最好的是获得正确的清单?

2 个答案:

答案 0 :(得分:0)

您无需加倍JOIN

SELECT 
    *
FROM
    [UserProfile] up
    INNER JOIN [Relationships] rel1 ON rel1.UserId = up.[Id] OR rel1.RelationId = up.[Id]
WHERE
     up.[Id] = 2

答案 1 :(得分:0)

试试这个:

SELECT DISTINCT
    up.[Id],
    up.[DisplayName],
    up.[IsPublic]
FROM
    [UserProfile] up
    INNER JOIN [Relationships] rel1 ON rel1.UserId = up.[Id] OR rel1.RelationId = up.[Id]
WHERE
    (rel1.[UserId] = 2 OR rel1.[RelationId] = 2) AND up.[Id] <> 2