根据条件加入不同的表

时间:2013-04-29 01:59:25

标签: sql sql-server-2008 join

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;

我希望看到来自功能表的数据,而不是userid我想要username
这里的问题是,如果userkey为0,请从 liteuser 表中获取username,否则从 premiumuser 表中获取。
数据应该像

'Upload content', 'stephen', 1
'Create account', 'apollo', 0
'View content', 'venus', 0

3 个答案:

答案 0 :(得分:19)

试试这个:

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

答案 1 :(得分: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

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

答案 2 :(得分:3)

您需要了解JOINSCASE条件。

SELECT f.id , CASE userkey WHEN 0 then l.name ELSE p.name END,f.userkey
FROM feature f
INNER JOIN liteuser
     ON f.user_id=l.user_id
INNER JOIN premiumuser p
     ON f.user_id=p.user_id

编辑:

根据Pieter Geerkens的建议,您可能需要LEFT JOIN。 LEFT JOIN导致从两个表中检索匹配的行PLUS非匹配的行 桌子位于连接的左侧。右侧表格中的行填充了NULL值。

INNER JOIN仅在连接字段中提供具有匹配值的行。