2013-04-29 19 views
5
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; 

Mi piacerebbe vedere i dati da funzione tavolo e invece di userid Voglio la username.
Il fermo qui è se userkey è 0, ottenere il username da liteuser tavolo, il resto da premiumuser tavolo.
I dati devono essere comeunire le tabelle diverse in base a condizione

'Upload content', 'stephen', 1 
'Create account', 'apollo', 0 
'View content', 'venus', 0 

risposta

14

Prova questo:

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 
2

Hai bisogno di sapere su JOINS e CASE condizione.

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 

EDIT:

Come suggerito da Pieter Geerkens, un LEFT JOIN può essere richiesto da voi. LEFT JOIN consente di recuperare righe corrispondenti da entrambe le tabelle PIÙ righe non corrispondenti dalla tabella situata a sinistra del join. Le righe della tabella destra sono riempite con il valore NULL.

INNER JOIN fornisce solo righe con valore corrispondente nel campo di unione.

+0

Ha! Ha! Mi hai battuto di un paio di secondi, e il codice è identico, fino agli stessi alias di una sola lettera. +1 –

+0

@PieterGeerkens Il join interno non è identico al join sinistro ... –

+0

@PieterGeerkens +1 al tuo signore –

3
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 

Io suggerisco di usare sinistra si unisce più di join interni, come ti sembra di essere chiedendo a tutti gli utenti associati a un determinato funzione. In questo modo, le funzionalità senza utenti associati avranno NULL come nome. Inoltre, l'utilizzo di due join interni rispetto alle tabelle utente restituirà solo quelle funzionalità che hanno una voce per lo stesso utente in entrambe le tabelle premium e lite.

+2

+1 anche per te. –

Problemi correlati