我的sql很弱,我正在努力获得我想要的结果,我确信这是简单的东西。
我有三张表:
user, usersetting and defaultsetting
用户表列:
UserId | Email
UserSetting表列:
UserId | SettingKey | IsEnabled
DefaultSetting表列:
SettingKey | IsEnabled
如果用户显式地更新了他们的设置,那么他们将只在usersetting表中有一条记录,否则他们应该只从defaultSetting表中获取设置。用户的设置为打开或关闭(IsEnabled)
我想要编写一个查询,该查询获取启用了设置X (settingKey = x)的所有用户。如果用户的UserSettings表中没有用于设置x的行,但是默认设置IsEnabled = true,那么我仍然希望为该用户获取一行。
所以从逻辑上讲,我想这样做
Select UserId, Email from User if they have turned setting x on explicitly or setting x defaults to on
发布于 2016-02-23 00:18:31
coalesce是你的朋友。
Select UserId, Email, coalesce(UserSetting.SettingKey, DefaultSetting.SettingKey) as SettingKey
from User
left join UserSetting
on user.userid = UserSetting.userid
left join DefaultSetting
on UserSetting.SettingKey = DefaultSetting.SettingKey
发布于 2016-02-23 00:47:03
这应该是可行的。我包含了用于测试的示例表和数据
create table #Users (UserId int, Email varchar(100))
create table #UserSetting (UserId int, SettingKey varchar(10), IsEnabled int)
create table #DefaultSetting (SettingKey varchar(10), IsEnabled int)
insert into #Users values (1, 'User1')
insert into #Users values (2, 'User2')
insert into #Users values (3, 'User3')
insert into #DefaultSetting values ('default', 1)
insert into #UserSetting values (1, 'pass1', 1)
insert into #UserSetting values (2, 'pass2', 1)
select u.UserId, u.Email, coalesce(us.SettingKey, ds.SettingKey) SettingKey
from #Users u
left join #UserSetting us on us.UserId = u.UserId and us.IsEnabled = 1
cross join #DefaultSetting ds
where coalesce(us.SettingKey, ds.SettingKey) = 'pass2'
https://stackoverflow.com/questions/35566446
复制