根据条件加入不同的表

Nul*_*ead 11 sql join sql-server-2008

create table [premiumuser] (user_id int, name nvarchar(50));
create table [liteuser] (user_id int, name nvarchar(50));
create table [feature] (id nvarchar(50), user_id int, userkey int);

insert into [premiumuser] select 1, 'stephen';
insert into [premiumuser] select 2, 'roger';

insert into [liteuser] select 1, 'apollo';
insert into [liteuser] select 2, 'venus';

insert into feature select 'Upload content', 1, 1;
insert into feature select 'Create account', 1, 0;
insert into feature select 'View content', 2, 0;
Run Code Online (Sandbox Code Playgroud)

我想看看功能表中的数据,而不是userid我想要的username.
这里的catch是if userkey为0,usernameliteuser表获取,否则从premiumuser表获取.
数据应该是这样的

'Upload content', 'stephen', 1
'Create account', 'apollo', 0
'View content', 'venus', 0
Run Code Online (Sandbox Code Playgroud)

Pie*_*ens 20

试试这个:

select 
    f.id,
        case when userkey=0 then l.name else p.name end as username
from [feature] f
    left join [liteuser] l on l.user_id = f.user_id
    left join [premium user] p on p.user_id = f.user_id
Run Code Online (Sandbox Code Playgroud)


Eso*_*ame 6

SELECT f.id
, (CASE WHEN f.userkey = 0 THEN l.name ELSE p.name END) AS name
, f.userkey
FROM feature f
LEFT JOIN liteuser l on f.user_id = l.user_id
LEFT JOIN premiumuser p on p.user_id = l.user_id
Run Code Online (Sandbox Code Playgroud)

我建议在内连接上使用左连接,因为您似乎在询问与给定功能关联的所有用户.这样,没有关联用户的功能将使用NULL作为名称.此外,对用户表使用两个内部联接仅返回在高级表和精简表中具有同一用户条目的那些功能.