[英]Join different tables based on condition
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表獲取username
。
數據應該是這樣的
'Upload content', 'stephen', 1
'Create account', 'apollo', 0
'View content', 'venus', 0
試試這個:
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
我建議在內連接上使用左連接,因為您似乎在詢問與給定功能關聯的所有用戶。 這樣,沒有關聯用戶的功能將使用NULL作為名稱。 此外,對用戶表使用兩個內部聯接僅返回在高級表和精簡表中具有同一用戶條目的那些功能。
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僅在連接字段中提供具有匹配值的行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.