6

表一包含

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

谢谢你的帮助。


感谢您的回复。我将重新发布这篇文章,并附上一些关于我正在尝试做的事情的额外信息,这可能会使事情复杂化。有人可以关闭这个吗?

4

5 回答 5

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       
于 2010-03-12T14:52:26.617 回答
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
于 2010-03-12T15:02:26.763 回答
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 查询。

于 2010-03-12T14:54:29.387 回答
1

正如其他评论者所指出的那样,您并没有准确地展示您如何将人和颜色联系起来。如果您使用的是链接表(person_id、color_id),那么在标准 SQL 中无法解决此问题,因为它需要数据透视表或交叉表,而这不是标准 SQL 的一部分。

如果您愿意添加颜色数量有限且已知和设计时间的条件,您可以提出一个解决方案,对每种颜色使用一个联接以及 SQL 中的 CASE 或 IF 函数。但这并不优雅,而且,我不相信这种情况会保持很长时间。

如果您能够想出一种不同的方式来存储颜色链接信息,您可能有更多的选择来生成您想要的输出,但是不同的存储技术意味着数据库的某种程度的非规范化,这很可能会导致其他困难。

否则,您将不得不在存储过程或应用程序代码中执行此操作。

于 2010-03-12T15:38:21.577 回答
-1

与其他一些海报所说的相反;我认为不需要第三张桌子。如果颜色是您的应用程序中众所周知的枚举,那么您不需要“颜色”表。

您正在寻找的是像这样的PIVOT

于 2010-03-12T14:57:22.010 回答