2011-03-10 60 views
0

我需要使用Inner Join連接5個表。SQL Server INNER JOIN會產生問題嗎?

這是一個很好的做法還是會做在以後的幾年任何不一致?

隨便看看

SELECT Distinct(email) 
FROM AP_GROUPS_INTO_ORGANIZATION M 
INNER JOIN GROUPSDB G on G.ID = M.GROUPID 
INNER JOIN aspnet_Roles r ON R.RoleName = G.GROUPNAME 
INNER JOIN aspnet_UsersInRoles U ON U.RoleId = R.RoleId 
INNER JOIN aspnet_membership a on a.UserId = U.UserId 
WHERE G.GROUPNAME = 'GROUP001' 
+6

5'JOIN's是確定的,如果這就是你所需要的語義。我可能會更改爲'WHERE EXISTS'而不是'JOIN',然後使用'DISTINCT'擺脫重複。確保您查看查詢計劃並在FK列上添加任何必需的索引。 – 2011-03-10 11:34:04

+1

@Martin我會非常小心的推薦DISTINCT的使用如此自由。我已經看到了開發人員編寫查詢的情況,查看了一堆重複內容,只需粘在DISTINCT中即可擺脫它們而不理解正在發生的事情。我不是在這裏說這種情況,但它不是我鼓勵人們在沒有考慮的情況下使用的。 – SecretDeveloper 2011-03-10 11:58:50

+1

@Kaius - 我絕對不建議'DISTINCT'我說的相反,事實上,他們應該使用'WHERE EXISTS' ** **代替(儘管可能不足夠強烈) – 2011-03-10 12:00:24

回答

1

這應該是罰款。我發現你在查詢中使用了aspnet表格,我建議不要先進行一些測試來改變它們的結構或索引,以確保你不會創建新問題。

它很常見的有這個號碼,如果你的數據是高度標準化的連接。

0

我會改變的唯一的事,它從把表基礎的標準限制了前面,而不是較低的連接表中的將移動你的組臺前面一樣......此外,壓痕的基礎有助於清楚地顯示錶格之間的關係。

SELECT 
     Distinct(email) 
    FROM 
     GROUPSDB G 
     INNER JOIN AP_GROUPS_INTO_ORGANIZATION M 
      ON G.ID = M.GROUPID 
     INNER JOIN aspnet_Roles r 
      ON G.GROUPNAME = R.RoleName 
      INNER JOIN aspnet_UsersInRoles U 
       ON R.RoleId = U.RoleId 
       INNER JOIN aspnet_membership a 
        on U.UserId = a.UserId 
    WHERE 
     G.GROUPNAME = 'GROUP001' 
-1

雖然是絕對沒有錯:

SELECT Distinct(email) 
FROM 
    AP_GROUPS_INTO_ORGANIZATION M 
     INNER JOIN 
    GROUPSDB G 
     ON G.ID = M.GROUPID 
     INNER JOIN 
    aspnet_Roles r 
     ON R.RoleName = G.GROUPNAME 
     INNER JOIN 
    aspnet_UsersInRoles U 
     ON U.RoleId = R.RoleId 
     INNER JOIN aspnet_membership a 
     ON a.UserId = U.UserId 
WHERE 
    G.GROUPNAME = 'GROUP001' 

fomatted因爲我更喜歡親自現在格式化已經進入了畫面, 如果您的服務器配置爲區分大小寫(雙關語意)比較可能要更改:
ON R.RoleName = G.GROUPNAMEON LOWER(R.RoleName) = LOWER(G.GROUPNAME)
G.GROUPNAME = 'GROUP001'LOWER(G.GROUPNAME) = LOWER('GROUP001')

這將防止未來的錯誤希望。

+0

-1結束語所有列使用以'在使JOIN謂詞完全不可變的函數中加入JOIN是一個糟糕的主意。 – 2011-03-10 16:43:59

+0

@Martin我不明白你的意思?什麼是'unsargable'。也是你投票,因爲格式偏好這是真正的個人喜好?答案是提出一個更重要的觀點,你有沒有讀過它? – mohsensajjadi 2011-03-10 17:51:02

+0

與個人格式設置無關! 'unsargable'意味着一個索引不能用於連接。 – 2011-03-10 23:49:00