SQL加入一对多关系

时间:2010-03-12 20:00:43

标签: sql foxpro visual-foxpro

好的,这是我原来的问题;

表一包含

ID|Name  
1  Mary  
2  John  

表二包含

ID|Color  
1  Red  
1  Blue
2  Blue  
2  Green  
2  Black  

我想最终得到的是

ID|Name|Red|Blue|Green|Black  
1  Mary Y   Y  
2  John     Y     Y     Y

似乎因为在表1中1000个记录中有11个颜色和1000个的唯一值,所以没有“好”的方法来做到这一点。那么,另外两个问题。

是否有一种有效的方法来查询以获得此结果?然后我可以在我的应用程序中创建交叉表以获得所需的结果。

ID|Name|Color  
1  Mary  Red  
1  Mary  Blue  
2  John  Blue  
2  John  Green  
2  John  Black

如果我想限制返回的记录数,我怎么能做一个查询来做这样的事情?

Where ((color='blue') AND (color<>'red' OR color<>'green'))

所以使用上面的例子我会回来

ID|Name|Color  
1  Mary  Blue  
2  John  Blue  
2  John  Black

我通过ADODB连接到Visual FoxPro表以使用SQL。谢谢!

2 个答案:

答案 0 :(得分:0)

您正在寻找交叉表查询。您可以尝试使用交叉表查询向导:
http://msdn.microsoft.com/en-us/library/aa979431%28VS.71%29.aspx

答案 1 :(得分:0)

根据您之前的问题,并查询VFP表,您可以获得结果 以下VFP限定查询...交叉表完成

select
      N.ID,
      N.Name,
      MAX( IIF( C.Color = "Red", "Y", " " )) Red,
      MAX( IIF( C.Color = "Blue", "Y", " " )) Blue,
      MAX( IIF( C.Color = "Green", "Y", " " )) Green,
      MAX( IIF( C.Color = "Black", "Y", " " )) Black
   FROM
      C_Names N,
      Colors C
   WHERE
      N.ID = C.ID
   GROUP BY 
      N.ID,
      N.Name

然后,由于您有其他“颜色”,只需复制相应颜色的MAX(IIF())并将列作为结果列名...按照模式。唯一的问题是,如果您对颜色有不同的区分大小写拼写,那么您可能需要UPPER(C.Color)=“RED”(或类似其他颜色)