SQL Query返回的数据太多

时间:2014-07-15 17:15:44

标签: sql

我试图为Spring Security定义权限用户名查询:

SELECT u.username, r.authrole FROM users u, roles r, user_role ur 
                   WHERE u.id = ur.userid AND u.username = 'dit'

令人尴尬,但这个查询返回错误的结果,我无法修复它。

结果:

 username     authrole  
-----------------------
   dit       ROLE_ADMIN   
   dit       ROLE_USER  

这是我的表格:

用户:

   id    username   password
---------------------------------
    1      admin     *****
    2       dit      *****

USER_ROLE:

  userid   roleid  
---------------------
    1        1   
    2        2   

作用:

  id     authrole  
---------------------
  1     ROLE_ADMIN   
  2     ROLE_USER  

更新:我从这个example on github

中接受了这个错误的查询

1 个答案:

答案 0 :(得分:3)

使用此(注意:INNER关键字是可选的):

SELECT u.username
       ,r.authrole
  FROM users u 
  INNER JOIN user_role ur 
    ON u.id = ur.userid 
  INNER JOIN roles r 
    ON r.id = ur.roleid 
  WHERE u.username = 'dit'

问题在于你正在加入角色表而没有给出如何加入表格的任何条件。结果将是一个笛卡尔积,其中显示了所连接表之间的所有可能组合。

然后加入WHERE子句,使用JOIN语法会更好(更清楚)。此外,更重要的是,使用JOIN语法会创建关注点分离。将您正在使用的字段加入where子句中的表可能会导致难以理解查询。

基本上有四种不同的连接:

  • INNER JOIN:当BOTH表中至少有一个匹配时返回所有行

  • LEFT JOIN:返回左表中的所有行,以及右表中匹配的行

  • RIGHT JOIN:返回右表中的所有行,以及左表中匹配的行

  • FULL JOIN:当其中一个表中有匹配时返回所有行