目标:编写一个可以带回公司所有用户和公司主要用户的查询。
我有一个时髦的情况,那里有我公司设置的登录结构。表格如下:
User
int int bit
UserId | CompanyId | IsPrimaryUser |
UserLoginBridge
int int
UserId | LoginId
Login
int
LoginId | CompanyId | ...
显然,这里的关系远远不够理想。但这是我必须要合作的。我的问题是可以将用户分配给许多公司..因此UserLoginBridge表示用户和登录之间存在1:M的关系。
还有一个主要用户......由IsPrimaryUser col中的1表示。此外,主要用户永远不会被放入UserLoginBridge,但他有一个登录条目....所以问题是......我无法加入主要用户。
有什么想法吗?
Ideal DataSet
UserId | IsPrimaryUser | CompanyId | LoginId
答案 0 :(得分:2)
我会试着用疯狂的方法解释这个方法。
第一个SELECT中的子查询“q”找到每个公司的最小登录ID。这些应该是主要用户的登录,每个公司一个。然后,我可以将主要用户加入CompanyId上的子查询。
普通用户的第二个选择不需要解释。
这可以在没有UNION的情况下使用COALESCE for CompanyId和LoginId编写,但我认为这个版本更容易阅读和理解。
/* Primary User */
SELECT u.UserId, u.IsPrimaryUser, q.CompanyId, q.LoginId
FROM User u
INNER JOIN (SELECT l.CompanyId, MIN(l.LoginId)
FROM login l
GROUP BY l.CompanyId) q
ON u.CompanyId = q.CompanyId
WHERE u.IsPrimaryUser = 1
UNION ALL
/* Regular Users */
SELECT u.UserId, u.IsPrimaryUser, l.CompanyId, l.LoginId
FROM User u
INNER JOIN UserLoginBridge ulb
ON u.UserId = ulb.UserId
INNER JOIN Login l
ON ulb.LoginId = l.LoginId
WHERE u.IsPrimaryUser = 0