SQL连接表

时间:2010-03-12 14:43:11

标签: sql foxpro visual-foxpro

表一包含

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

感谢您的帮助。


感谢您的回复。我将重新发布一些关于我正在尝试做的事情的其他信息,这可能会使这一点复杂化。有人可以关闭这个吗?

5 个答案:

答案 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。