Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 根据条件连接不同的表_Sql_Sql Server 2008_Join - Fatal编程技术网

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