表一包含
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
感谢您的帮助。
感谢您的回复。我将重新发布一些关于我正在尝试做的事情的其他信息,这可能会使这一点复杂化。有人可以关闭这个吗?
答案 0 :(得分:6)
如果您使用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
答案 1 :(得分:2)
我可以使用带子查询的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
答案 2 :(得分:1)
我认为你最终会得到这样的结果:
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不支持MS Access等PIVOT查询。
答案 3 :(得分:1)
正如其他评论者指出的那样,您无法准确显示您如何链接人物和颜色。如果您正在使用链接表(person_id,color_id),则无法在标准SQL中解决此问题,因为它需要透视或交叉制表,这不是标准SQL的一部分。
如果您愿意添加颜色数量有限且已知和设计时间的条件,您可以为SQL中的每种颜色和CASE或IF函数使用一个连接提供解决方案。但这并不优雅,而且,我不相信这种情况会长久保持真实。
如果你能够提出一种不同的存储颜色链接信息的方法,你可能有更多选择来产生你想要的输出,但是不同的存储技术意味着数据库的某种程度的非规范化,这很可能导致其他困难。
否则,您必须在存储过程或应用程序代码中执行此操作。
答案 4 :(得分:-1)
与其他一些海报所说的相反;我认为不需要第三张桌子。如果颜色是您应用程序中众所周知的枚举,那么您不需要“颜色”表。
你正在寻找的是像one这样的PIVOT。