无法加入的数据联盟

时间:2011-03-03 20:55:15

标签: sql stored-procedures

目标:编写一个可以带回公司所有用户和公司主要用户的查询。

我有一个时髦的情况,那里有我公司设置的登录结构。表格如下:

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

1 个答案:

答案 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