Db2

如何從此數據庫中獲取未訂閱使用者的列表?

  • July 27, 2019

我有 2 張桌子。

  1. 訂閱類型
| type |
 'type1'
 'type2'
  1. 訂閱
| 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.

引用自:https://dba.stackexchange.com/questions/243914