Sql 根据条件连接不同的表
我想查看功能表中的数据,而不是Sql 根据条件连接不同的表,sql,sql-server-2008,join,Sql,Sql Server 2008,Join,我想查看功能表中的数据,而不是用户ID我想要的是用户名 这里的问题是,如果userkey为0,则从liteuser表获取username,否则从premiumuser表获取。 数据应该是 create table [premiumuser] (user_id int, name nvarchar(50)); create table [liteuser] (user_id int, name nvarchar(50)); create table [feature] (id nvarchar(5
用户ID
我想要的是用户名
这里的问题是,如果
userkey
为0,则从liteuser表获取username
,否则从premiumuser表获取。数据应该是
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;
你需要了解你的身体状况
'Upload content', 'stephen', 1
'Create account', 'apollo', 0
'View content', 'venus', 0
编辑:
正如Pieter Geerkens所建议的,您可能需要左连接。
左联接将导致从两个表中检索匹配行,再从中检索不匹配行
位于联接左侧的表。右侧表中的行用空值填充
内部联接只提供联接字段中具有匹配值的行 试试这个:
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
我建议使用左连接而不是内部连接,因为您似乎在询问与给定功能关联的所有用户。这样,没有关联用户的功能的名称将为NULL。此外,对用户表使用两个内部联接只会返回那些在premium和lite表中都有相同用户项的功能。True:更正确,因为我认为OP在这里需要左联接,因为我相信一次只会存在一个。@mhasan针对用户表的内部联接意味着只有当三个表中都存在相同的用户id时,结果才会返回。您的代码将用于问题中的示例数据,但我怀疑这些模式的生产数据在两个用户表中是否有重复的用户记录。
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
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