2010-03-12 126 views
0

好的,这是我的原始问题;SQL加入一对多关系

表一个包含

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 

看来,因为有颜色的11个独特的价值观和在表1的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')) 

因此,使用上面的例子中我会然后通过ADODB回来

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

我连接到Visual FoxPro表使用SQL。谢谢!

+0

问题是什么?这不清楚。 – 2010-03-12 20:03:02

回答

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”(或其他颜色相似)

+0

谢谢。这样做没有任何明显的处理时间增加。 – Harley 2010-03-12 22:49:15