Таблица каждый содержит
ID|Name
1 Mary
2 John
Таблица два содержит
ID|Color
1 Red
2 Blue
2 Green
2 Black
Я хочу закончить с,
ID|Name|Red|Blue|Green|Black
1 Mary Y Y
2 John Y Y Y
Спасибо за любую справку.
Спасибо за ответы. Я собираюсь повторно отправить это с некоторой дополнительной информацией о точно, что я пытаюсь сделать, который может усложнить это. Кто-то может закрыть это?
Если вы используете T-SQL, вы можете использовать PIVOT ( http://msdn.microsoft.com/en-us/library/ms177410.aspx )
Вот запрос, который я использовал:
declare @tbl_names table(id int, name varchar(100))
declare @tbl_colors table(id int, color varchar(100))
insert into @tbl_names
select 1, 'Mary'
union
select 2, 'John'
insert into @tbl_colors
select 1, 'Red'
union
select 1, 'Blue'
union
select 2, 'Green'
union
select 2, 'Blue'
union
select 2, 'Black'
select name,
case when [Red] is not null then 'Y' else '' end as Red,
case when [Blue] is not null then 'Y' else '' end as Blue,
case when [Green] is not null then 'Y' else '' end as Green,
case when [Black] is not null then 'Y' else '' end as Black
from
(
select n.id, name, color from @tbl_names n
inner join @tbl_colors c on n.id = c.id
) as subq
pivot
(
min(id)
FOR color IN ([Red], [Blue], [Green], [Black])
) as pvt
И вот результат:
John Y Y Y
Mary Y Y
Я могу использовать оператор CASE с подзапросом для ввода значений Y.
select ID, Name,
case
when exists (select * from Colors C where C.ID = N.ID and Color = 'Red') then
'Y'
else
NULL
end
,
case
when exists (select * from Colors C where C.ID = N.ID and Color = 'Blue') then
'Y'
else
NULL
end
,
case
when exists (select * from Colors C where C.ID = N.ID and Color = 'Green') then
'Y'
else
NULL
end
,
case
when exists (select * from Colors C where C.ID = N.ID and Color = 'Black') then
'Y'
else
NULL
end
from Names N
Как отмечали другие комментаторы, вы не показываете, как именно вы связываете людей и цвета. Если вы используете связывающую таблицу (person_id, color_id), тогда нет способа решить эту проблему в стандартном SQL, поскольку для этого требуется сводная таблица или перекрестная таблица, которые не являются частью стандартного SQL.
Если вы хотите добавить условие, что количество цветов ограничено и известно, и время разработки, вы можете придумать решение, используя одно соединение для каждого цвета и функции CASE или IF в SQL. Но это было бы некрасиво, и, более того, я бы не поверил, что это условие останется верным очень долго.
Если вы можете придумать другой способ хранения информации о связывании цветов, у вас может быть больше возможностей для получения желаемого результата, но другой метод хранения подразумевает некоторую степень денормализации базы данных, которая вполне может вызвать другие сложности.
В противном случае вам придется сделать это в коде хранимой процедуры или приложения.
Вопреки тому, что сказали некоторые другие постеры, я не вижу необходимости в третьей таблице. Если цвета являются хорошо известным перечислением в вашем приложении, то вам не нужна таблица "Color".
Что вам нужно, так это PIVOT, подобный этому one.
Думаю, в итоге вы получите что-то вроде этого:
SELECT t1.ID,
t1.Name,
CASE
WHEN red.ID IS NULL THEN ''
ELSE 'Y'
END As Red,
CASE
WHEN blue.ID IS NULL THEN ''
ELSE 'Y'
END As Blue
FROM Table1 t1
LEFT JOIN Table2 Red
ON t1.ID = Red.ID AND Red.Color = 'Red'
LEFT JOIN Table2 Blue
ON t1.ID = Blue.ID AND Blue.Color = 'Blue'
MS Sql не поддерживает запросы PIVOT, такие как MS Access.