我只在表格中包含了与此相关的列,所以请查看用户和地址表中列的缺失。
快速了解系统。 “经销商”是这里的主要关系,它们位于角色树的顶部。为了创建管理器,您需要将它们绑定到分发服务器,因此需要将它们绑定到DistributorManagerRelationship表。创建代表时,必须将它们绑定到经理,并且该经理只能是与所选分销商关联的经理。因此,在下表中,Live Labs是唯一可以创建代表的分销商,因为该帐户下有经理。
地址表
addressId firstName lastName companyName
82 Mary Mertens IRON Co.
83 John Smith Live Labs
84 Lauren Cole NULL
85 Sam Little NULL
86 Wayne Brady NULL
87 Ronald Foster NULL
88 Shawn Wood NULL
用户表
userId active username role addressId
19 1 mary distributor 82
20 1 john distributor 83
21 1 lauren manager 84
22 1 sam manager 85
23 1 wayne manager 86
24 1 ronald representative 87
25 1 shawn representative 88
DistributorManagerRelationship
distributorId managerId
20 21
20 22
20 23
ManagerRepRelationship
repId managerId
24 21
24 22
25 22
这是我遇到的问题。当分销商登录并查看他下面的所有用户(他的经理和代表)时,我所拥有的SQL语句只会抓住在ManagerRepRelationship表中具有关系的代表和经理。所以举个例子。
SELECT DISTINCT Users.userId, Users.role, Users.username, Address.firstName, Address.lastName
FROM Users
JOIN Address
ON Users.addressId=Address.addressId
JOIN ManagerRepRelationship
ON Users.userId=ManagerRepRelationship.repId
OR Users.userId=ManagerRepRelationship.managerId
JOIN DistributorManagerRelationship
ON Users.userId=DistributorManagerRelationship.managerId
OR ManagerRepRelationship.managerId=DistributorManagerRelationship.managerId
WHERE DistributorManagerRelationship.distributorId=20 AND Users.userId!=20 ORDER BY Address.lastName
上述SQL语句将返回与Live Labs EXCEPT userId 23(Wayne Brady)相关联的所有代表和经理。我理解为什么会这样,因为Wayne与JOIN的参数不匹配,因为他缺乏代表性。我一直在与这个SQL语句作斗争几个小时,我似乎无法做到正确。我想要的结果是所有管理人员和销售代表都与Live Labs相关联,即使ManagerRepRelationship表中没有关系也是如此。也许我需要结合两个不同的JOIN查询?我被卡住了。
我希望我能很好地解释这个问题,如果我没有说清楚的话,请发表评论。
答案 0 :(得分:1)
如果您想要包含没有代表的人,那么您希望允许null
代表值,而不是
JOIN ManagerRepRelationship
你需要
LEFT JOIN ManagerRepRelationship