2017-01-29 144 views
-1

我有2個表,SQL查詢2 VS加入

用戶

  • 用戶名PK
  • 暱稱

權限

  • 用戶名FK給用戶
  • permission_text

給定一個username,是否有可能返回1行的所有權限和用戶的詳細信息?

我可以想到兩種方法,方法1是SELECT * FROM permissions WHERE username = <username>,並做了SELECT * FROM users WHERE username = <username>的另一個查詢。

方法二是加入兩個表,並把第一行的用戶的細節和一個循環從該行的其餘部分獲得許可。

我不覺得這兩種方法在關係型數據庫的術語很乾淨。我應該做什麼樣的查詢以便獲取用戶詳細信息和權限數組?

+2

對於postgresql,請使用string_agg()函數。 參見:http://stackoverflow.com/questions/15847173/concatenate-multiple-result-rows-of-one-column-into-one-group-by-another-column – bbb8989

回答

0

要檢索兩個數據集具有非常不同的基數。有關用戶的詳細信息包含一個(如果用戶可能不存在,則爲零)行。雖然這個用戶擁有的權限可能會是一個非常大的集合。

一種解決方案,通過bbb8989指出的那樣,是爲了將結果連接成一個字符串,並在客戶端的語言做一些後處理。不過,我不太喜歡這個解決方案,因爲返回的值不是原子的。

另一種解決方案是做一個連接,但隨後有關用戶的詳細信息的所有字段將被複制,這是一個潛在的巨大的網絡帶寬損失。

因此,我的建議是隻使用兩個不同的查詢,這裏沒有明顯的優勢,合併這些查詢;除非他們經常執行,但我寧願建議將查詢合併到另一個方向;也就是說,一次檢索所有感興趣的用戶的用戶詳細信息。