2011-03-03 81 views
2

目標:編寫一個查詢,可以帶回公司的所有用戶以及公司的主要用戶。無法加入的數據聯盟

我有我的公司已經設置的登錄結構的時髦情況。表格看起來像這樣:

User 

    int  int   bit 
UserId | CompanyId | IsPrimaryUser | 

UserLoginBridge 

    int  int 
UserId | LoginId 

Login 

int 
LoginId | CompanyId | ... 

很明顯,這裏的關係遠不如最佳。但這是我必須與之合作的。我的問題是,用戶可以分配給許多公司..因此UserLoginBridge表示用戶和登錄之間存在1:M的關係。

還有一個主用戶...由IsPrimaryUser列中的1表示。另外,主用戶永遠不會進入UserLoginBridge,但他有一個登錄入口....所以,捕獲是..我不能加入我的方式主要用戶。

有什麼想法?

Ideal DataSet 

UserId | IsPrimaryUser | CompanyId | LoginId 
+0

那麼你的理想結果集是什麼樣的? – JNK

+0

如何在UserLoginBridge中不存在PrimaryUser的LoginId? –

+0

@Joe Stefannelli因爲具有指定的companyid的登錄條目的最早出現是主登錄ID ... yay Lolz。 –

回答

2

我會盡力解釋我的瘋狂的方法。

第一個SELECT中的子查詢「q」查找每個公司的最小登錄ID。這些應該是主要用戶的登錄名,每個公司一個。然後,我可以將主要用戶加入到CompanyId上的子查詢中。

對於普通用戶的第二選擇應該不需要解釋。

這可以在沒有UNION的情況下使用CompanyId和LoginId的COALESCE編寫,但我認爲這個版本更容易閱讀和理解。

/* 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 
+0

這絕對符合我一直在嘗試的方向。我道歉..我說謊的事實是,我知道在用戶和UserLoginBridge表中存在NULLS ...在這些條件下仍然有其他條目存在的機會。另外需要注意的是用戶不能被分配到登錄入口。 –

+0

默認情況下,指定companyId的最低登錄ID是主用戶登錄ID –

+0

@Matthew Cox:根據此信息更新了我的答案。 –