簡體   English   中英

根據條件加入不同的表

[英]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作為名稱。 此外,對用戶表使用兩個內部聯接僅返回在高級表和精簡表中具有同一用戶條目的那些功能。

您需要了解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僅在連接字段中提供具有匹配值的行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM