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; 

Chciałbym zobaczyć dane z cecha tabeli i zamiast userid chcę username.
Połów o to, czy userkey wynosi 0, uzyskać username z liteuser stole, inny od premiumuser stołowego.
Dane powinny być jakDołącz do różnych tabel w oparciu o stan

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

Odpowiedz

14

Spróbuj tego:

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

Musisz wiedzieć o JOINS i CASE warunek.

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:

Jak sugeruje Pieter Geerkens, LEFT JOIN mogą być wymagane przez ciebie. LEWY POŁĄCZENIE powoduje pobranie pasujących wierszy z obu tabel PLUS niepasujących wierszy z tabeli umieszczonej na lewej stronie łączenia. Wiersze z tabeli prawide są wypełnione wartością NULL.

WEJŚCIE WEWNĘTRZNE nadaje tylko wiersze o pasującej wartości w polu łączenia.

+0

Ha! Ha! Pokonałeś mnie o kilka sekund, a kod jest identyczny, aż do tych samych jednoliterowych aliasów. +1 –

+0

@PieterGeerkens Inner join nie jest tożsamy ​​z lewym złączem ... –

+0

@PieterGeerkens +1 do ciebie sir –

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 

Proponuję za pomocą lewej dołącza nad sprzężenia wewnętrzne, jak to wydaje się być pytanie o wszystkich użytkownikach związanych z daną funkcją. W ten sposób funkcje bez powiązanych użytkowników będą miały nazwę NULL. Ponadto użycie dwóch wewnętrznych sprzężeń względem tabel użytkowników zwróci tylko te funkcje, które mają wpis dla tego samego użytkownika w tabelach premium i lite.

+2

+1 także dla Ciebie. –

Powiązane problemy