2013-12-17 30 views
1

我有一种情况,我只需要在特定条件下加入表格。
让我们的承销方案根据条件加入表

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; 

现在我想从premiumUser或精简版用户一次只能加入1台。

select F.*, U.Name from feature 
Inner Join 
if condition 1 
then 
    LiteUser U on U.User_Id = F.User_ID 
else 
    PremiumUser U on U.User_Id = F.User_ID 
end 

反正有没有做到这一点???

我知道这样的事情可以做

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 

,但因为我有巨大的表,我不想参加这两个表。 我想要有选择地加入表

+0

_mention的RDBMS_ –

+0

问题的部分似乎是你的数据结构。您应该考虑将所有用户放入单个数据库,然后使用列(外键,偶数)标记“用户类型”。如果您正在复制表格结构,那么这表示您的方法可能存在问题。 – JDB

+0

这不是我的确切数据库设计..这是相当巨大,非常不同....这只是一个样本,我从某处解释我的问题.. – Gautam

回答

3

不,你不能有选择地加入标准的TSQL(对于MS SQL肯定是真的,我敢肯定它对于Oracle和MySQL是真的)。

但是,您可以将条件放入连接中。这将允许SQL很快忽略加入,因为它会为了评估条件:

select 
    f.id, 
    case when userkey=0 then l.name else p.name end as username 
from [feature] f 
left join [liteuser] l 
     on condition1 = 1 
     AND l.user_id = f.user_id 
left join [premium user] p 
     on condition1 = 2 
     and p.user_id = f.user_id 
+0

感谢格雷格...工作像魅力.. – Gautam