Db2
如何從此數據庫中獲取未訂閱使用者的列表?
我有 2 張桌子。
- 訂閱類型
| type | 'type1' 'type2'
- 訂閱
| user | sub_type | subscribed | 'U1' 'type1' 'Y' 'U1' 'type2' 'Y' 'U2' 'type1' 'Y'
從此 ERD 中,您可以看到使用者“U2”沒有訂閱“type2”的條目。我想要一份沒有訂閱記錄的使用者的報告。
到目前為止,我有:
select user, count(1) from subscriptions group by user having count(1) != (select count(1) from subscription_types);
這給了我一個沒有所有訂閱的使用者列表。但不是他們缺少哪些。
我已經嘗試了許多不同的連接查詢變體,其中 subscription_type 為空,沒有運氣。
我希望下面的查詢能解決它,但可惜它沒有
select user, sub_type from subscriptions group by user, sub_type having sub_type not in (select type from subscription_types);
在我看來,您想要使用者和訂閱類型之間的笛卡爾積,減去訂閱:
select distinct s.user, st.subscription_types from subscriptions s cross join subscription_types st except select user, sub_type from subscriptions
當然,這可以用其他方式表達,但這可能是最明顯的一種。
試試這個:
with subscription_types (type) as ( values 'type1' , 'type2' ) , subscriptions (user, sub_type, subscribed) as ( values ('U1', 'type1', 'Y') , ('U1', 'type2', 'Y') , ('U2', 'type1', 'Y') ) select u.user, t.type from ( select distinct s.user from subscriptions s ) u, subscription_types t where not exists (select 1 from subscriptions s where s.user=u.user and s.sub_type=t.type);
這個想法是獲取所有使用者和類型組合,並僅返回那些不存在於
subscriptions
.