2011-03-28 62 views
0

我有兩個表,我給USERNAME最佳查詢:N的關係

User: 
    USERID 
    USERNAME 
    ...other fields... 

AccessRights (Many to One relationship with User.USERID): 
    USERID 
    GRANT 

我想User.*領域,並全部AccessRights其中AccessRights.USERID=User.USERID

我能做到這一點的一個以下幾個方法:

  • 兩個單獨的查詢,首先爲用戶,獲取用戶標識並使用它作爲一個參數在第二個查詢
  • 加入的表,但是這一切複製用戶的*數據在許多行
  • 做一些時髦的存儲過程當元帥的成果轉化爲一個場

但我有這種直覺,我不是想着一些更好的方法,所以我想我會問。

+1

聽起來就像你已經覆蓋了所有的基地,雖然我給了任意數量的「AccessRights」關聯避開選項3。僅供參考,一個體面的ORM將使用#2,生成遇到的每個父對象並添加每行的關聯 – Phil 2011-03-28 04:09:18

+0

是否有明確的理由說明,爲什麼要特別使用「User。*'」而不是顯式指定User中的所有列?你害怕打字嗎? – SingleNegationElimination 2011-03-28 04:09:50

+1

@TokenMacGuy:你的問題是100%offtopic。一般來說'''沒有什麼不好的。 – zerkms 2011-03-28 04:11:42

回答

1

根據數據庫的不同,還可以發送腳本輸出多個結果集。它也依賴於你編碼的語言。但是在Java中,如果你使用Statement.execute(與executeQuery),你可以從查詢中檢索多個結果集。

這樣,您可以先從用戶表進行查詢,然後將您要查找的用戶填充到本地變量中,然後使用該變量查詢AccessRights表。

很可能,除非你談論的是AccessRights中的大量行或User中的大量列,否則執行聯接要簡單得多,而且效率更高。試着只從你需要的用戶那裏獲得這些字段。通過網絡傳輸數據的額外字節可能比多次訪問數據庫來單獨查詢每個表的開銷少(除非您使用上述方法,這是一次打擊,但對於大多數情況來說可能是過度的,因爲它有點複雜)。

0

一個選項是獲取user.*數據並獲得AccessRights行值作爲使用函數的逗號分隔字符串。像:

| user1 | 1234 | right1,right2,right3 | 

在T-SQL(MS SQL服務器),可以使用COALESCESTUFF功能,並且還可以內聯的,而不是使用單獨的功能操作。

但是,您需要注意性能。