[英]Simple join table assigning default values for each row (sql fiddle included)
我敢肯定這個問題有一個非常簡單的答案,但是我很難找到它。
我有一個表,其中包含屬於用戶的設置。
| user_id | setting | value |
-------------------------------
| 1 | paying? | true |
| 2 | paying? | false |
| 2 | demo? | true |
| 2 | active? | true |
我還有一個帶有默認設置的表,以防特定用戶不存在該設置。
| setting | value |
---------------------
| paying? | true |
| demo? | true |
| active? | false |
| hidden? | false |
我需要做的是返回每個用戶的所有設置(僅當沒有分配給該用戶時才使用默認設置):
| user_id | category | value |
-------------------------------
| 1 | paying? | true |
| 1 | demo? | true |
| 1 | active? | false |
| 1 | hidden? | false |
| 2 | paying? | false |
| 2 | demo? | true |
| 2 | active? | true |
| 2 | hidden? | false |
此聯接不會為每個用戶返回結果。 我究竟做錯了什么?
SELECT u.user_id, COALESCE(u.category, g.category) as category, COALESCE(u.value, g.value) as value
FROM user_settings as u
FULL OUTER JOIN global_settings as g on u.category = g.category
ORDER BY u.user_id, u.category
將具有global_settings的不同用戶交叉連接,然后將user_settings表左連接到此。
SELECT u.user_id, COALESCE(us.category, g.category) as category,
COALESCE(us.value, g.value) as value
FROM (select distinct user_id from user_settings) as u
cross join global_settings g
left join user_settings as us on us.category = g.category and us.user_id=u.user_id
order by 1,2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.