【问题标题】:How can I include rows with a column value greater than what is returned in a SQL query that utilizes inner joins?如何包含列值大于使用内部联接的 SQL 查询中返回的值的行?
【发布时间】:2021-04-01 11:34:08
【问题描述】:

我有三张桌子:

用户

id          Username
---------------------------
1     |     John
2     |     Mark

职位

id          Position          Authority          Department 
---------------------------------------------------------------
1     |     Supervisor    |       3                  4
2     |     Clerk         |       4                  2    
3     |     Supervisor    |       3                  2
4     |     Admin         |       4                  4
5     |     Assistant     |       5                  2

用户位置

user_id          position_id 
----------------------------
1               |     1 
2               |     3 

Users 和 Positions 表使用 UserPositions 表相互关联,该表通过每个表的 id(外键)连接它们。

我正在尝试返回结果,其中包括大于或等于分配给用户的权限和部门的任何内容。到目前为止,我能够解决这个问题:

SELECT A.Username, B.Position, B.Authority, B.Department FROM UserPositions C
LEFT JOIN Users A on C.user_id = A.Id
LEFT JOIN Positions B on C.position_id = B.Id

返回:

Username         Position          Authority          Department 
---------------------------------------------------------------
John        |     Supervisor   |      3           |       4
Mark        |     Supervisor   |      3           |       2

但是,我想为该用户添加属于同一部门但又高于该用户所分配权限的职位。例如,John 已被分配到部门 4 和权限 3 的职位主管。所以我想返回部门 4 中所有职位的列表,并且权限为 3 或更大,并将其列在 John 旁边。马克也是一样。像这样:

Username         Position          Authority          Department 
---------------------------------------------------------------
John        |     Supervisor   |      3           |       4
John        |     Admin        |      4           |       4
Mark        |     Supervisor   |      3           |       2
Mark        |     Clerk        |      4           |       2
Mark        |     Assistant    |      5           |       2

如何修改上面的查询以获得此结果?

【问题讨论】:

    标签: sql sql-server left-join inner-join


    【解决方案1】:

    我认为这是另一个加入:

    select u.username, p1.position, p1.authority, p1.department 
    from userpositions   up
    inner join users     u  on u.id = up.user_id
    inner join positions p  on p.id = up.position_id
    inner join positions p1 on p1.department = p.department and p1.authority >= p.authority
    

    注意事项:

    • 我把left joins 变成了inner join;您的问题陈述中没有任何内容表明您想要前者

    • 有意义的表别名使查询更容易理解

    【讨论】:

    • 谢谢谢谢谢谢!这正是我所需要的!
    猜你喜欢
    • 1970-01-01
    • 2011-04-25
    • 2020-12-08
    • 2014-06-06
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 2016-02-26
    • 2018-12-13
    相关资源
    最近更新 更多