Делая некоторые предположения о структуре ваших данных, я создал фиктивные таблицы для этого примера:
create table #badges
(
badge_id int,
[name] varchar(50),
[description] varchar(50)
)
create table #users
(
[user_id] int,
[name] varchar(50)
)
create table #users_badges
(
id int,
badge_id int,
[user_id] int
)
insert into #badges
values
(1,'Starter Badge','It''s your first time.'),
(2,'Rookie Badge','You''re just getting started.'),
(3,'Intermediate Badge','Now you''re starting to get the hang of this.'),
(4,'Expert Badge','You are a master!')
insert into #users
values
(1,'John Smith'),
(2,'Alice Johnson'),
(3,'Phillip Black'),
(4,'Sarah Goodwell'),
(5,'Ian Hunter')
insert into #users_badges
values
(1,1,1),
(2,1,2),
(3,1,3),
(4,1,4),
(5,2,1),
(6,2,2),
(7,2,4),
(8,3,5),
(9,4,1),
(10,4,2)
Я думаю, что это результат, который вы ищете (здесь, в частности, на пользователя сuser_id
из 1 - Джон Смит):
select
b.*,
case when ub.id is not null then 'Earned' else null end as badgeStatus
from #badges b
left join #users_badges ub on b.badge_id = ub.badge_id and ub.[user_id] = 1
Здесь перечислены все значки и показано, какие из них Джон заработал:
/------------------------------------------------------------------------|--------\
| id | name | description | status |
|----|--------------------|----------------------------------------------|--------|
| 1 | Starter Badge | It's your first time. | Earned |
| 2 | Rookie Badge | You're just getting started. | Earned |
| 3 | Intermediate Badge | Now you're starting to get the hang of this. | NULL |
| 4 | Expert Badge | You are a master! | Earned |
\---------------------------------------------------------------------------------/