13
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,username则从liteuser表中获取,否则从高级用户表中获取。
数据应该像

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

3 回答 3

24

试试这个:

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
于 2013-04-29T02:04:10.327 回答
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 作为名称。此外,对用户表使用两个内部联接将仅返回在高级和精简表中具有相同用户条目的那些功能。

于 2013-04-29T02:05:30.007 回答
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 会导致从两个表中检索匹配的行,以及从位于 join 左侧的表中检索不匹配的行。右侧表中的行用 NULL 值填充。

INNER JOIN 只给出在连接字段中具有匹配值的行。

于 2013-04-29T02:03:56.953 回答