返回2个表中的所有行和第3个表中的信息

时间:2014-02-18 16:06:34

标签: sql

我在找到理想的结果时遇到了麻烦。

我有3个表:tbl_Policy'a',tbl_User'b',tbl_Reviewed'c'。

当用户审核政策时,来自“b”的用户ID和来自“a”的政策代码将输入带有当前日期(datereviewed)的“c”。

编辑:我需要查看所有用户,所有政策以及是否已经过审核。

对于这个例子:John已经审查了所有3个政策; 詹姆斯只审查了IT政策;和 莎拉没有审查任何

理想情况下,输出为:

User     Policy      Date Reviewed
John     HR          January 2, 2014
John     IT          January 3, 2014
John     Smoking     January 4, 2014
James    HR          NULL
James    IT          January 5, 2014
James    Smoking     NULL
Sarah    HR          NULL
Sarah    IT          NULL
Sarah    Smoking     NULL

通过以下查询,我可以获得所有用户和所有策略,但是我为每个已完成的策略获得了所有3个策略的条目。

  select username, policyname, datereviewed
  from tbl_policy a, tbl_user b LEFT JOIN tbl_reviewed c ON c.userid = b.userid

使用上面的示例,输出:

User     Policy      Date Reviewed
John     HR          January 2, 2014
John     IT          January 2, 2014
John     Smoking     January 2, 2014
John     HR          January 3, 2014
John     IT          January 3, 2014
John     Smoking     January 3, 2014
John     HR          January 4, 2014
John     IT          January 4, 2014
John     Smoking     January 4, 2014
James    HR          January 2, 2014
James    IT          January 2, 2014
James    Smoking     January 2, 2014
Sarah    HR          NULL
Sarah    IT          NULL
Sarah    Smoking     NULL

我希望这很清楚,可以给你一个想法,希望能帮助我。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

不要在from子句中混用不同类型的连接。事实上,从不在那里使用逗号:

select u.username, p.policyname, r.datereviewed
from tbl_user u LEFT JOIN
     tbl_reviewed r
     ON u.userid = r.userid LEFT JOIN
     tbl_policy p
     ON p.policyid = r.policyid;

这从tbl_user开始,因为您希望查看所有用户,可能是他们是否有任何已审核的政策。

我猜测政策的加入条件。

编辑:

现在我明白了你想做什么。您希望为每个用户和每个策略添加一行以及日期:

select u.username, p.policyname, r.datereviewed
from tbl_user u cross join
     tbl_policy p LEFT JOIN
     tbl_reviewed r
     ON u.userid = r.userid and
        p.policyid = r.policyid
order by username, policyname;