Sql MS访问记录集中的不同记录

Sql MS访问记录集中的不同记录,sql,ms-access,Sql,Ms Access,因此,我似乎再次遇到了MS Access过于挑剔的问题,尽管在SSMS SQL Server Management Studio中尝试类似查询时,这似乎也是一个问题 我有一个表集合,松散地定义如下: 表小部件_mfg{id int,name nvarchar} 表小部件{id int,name nvarchar,mfg_id int} 表widget_component{id int,name nvarchar,widget_id int,component_id} 表组件{id int,nam

因此,我似乎再次遇到了MS Access过于挑剔的问题,尽管在SSMS SQL Server Management Studio中尝试类似查询时,这似乎也是一个问题

我有一个表集合,松散地定义如下:

表小部件_mfg{id int,name nvarchar} 表小部件{id int,name nvarchar,mfg_id int} 表widget_component{id int,name nvarchar,widget_id int,component_id} 表组件{id int,name nvarchar,…}-此表中约有25列 我想做的是查询数据库并获得特定制造商使用的所有组件的列表。我尝试了以下一些查询:

SELECT c.*, wc.widget_id, w.mfg_id
FROM ((widget_component wc INNER JOIN widget w ON wc.widget_id = w.id)
INNER JOIN widget_manufacturer wm on w.mfg_id = wm.id)
INNER JOIN component c on c.id = wc.component_id
WHERE wm.id = 1
前面的示例显示了包含在不同小部件的多个小部件组件列表中的任何部件的副本

我也尝试过这样做:

SELECT DISTINCT c.id, c.name, wc.widget_id, w.mfg_id
FROM component c, widget_component wc, widget w, widget_manufacturer wm
WHERE wm.id=w.mfg_id AND wm.id = 1
这根本没有显示任何内容。我正在阅读有关子查询的文章,但我不明白它们是如何工作的,或者它们将如何应用到我当前的应用程序中

这方面的任何援助都是有益的

顺便说一句,一般来说,我对MS Access或SQL都不是很在行。我知道基本情况,但除此之外我知道的不多

编辑:

我刚刚尝试了这段代码,它可以获取所有的component.id,同时将它们限制为单个条目。如何使用此结果获取组件数据组件的所有其余部分的列表。*其中第一部分的id用于选择此数据

SELECT DISTINCT c.part_no
FROM component c, widget w, widget_component wc, widget_manufacturer wm
WHERE(((c.id=wc.component_id AND wc.widget_id=w.id AND w.mfg_id=wm.id AND wm.id=1)))

另外,这可能不是最好的方法,但我仍在学习SQL。

听起来组件到小部件的关系是一对多的。因此,复制品。i、 例如,同一组件由多个小部件使用

您的选择几乎可以-

SELECT c.*, wc.widget_id, w.mfg_id
但是wc.widget_id导致了上述假设的重复

因此,从SELECT中删除wc.widget_id,或者将其聚合为min、max、count等。。移除更容易。如果您拒绝,请记住添加GROUPBY子句

试试这个:

SELECT DISTINCT c.*, w.mfg_id
另外-FWIW,通常使用字段名而不是*

我想做的是查询数据库并获得所有 特定制造商使用的组件

有几种方法可以做到这一点。IN可能是最容易写的

SELECT c.* 
FROM   component c 
WHERE  c.id IN (SELECT c.component_id 
                FROM   widget w 
                       INNER JOIN widget_component c 
                         ON w.id = c.widget_id 
                WHERE  w.mfg_id = 123) 
IN子查询查找特定制造商使用的所有组件ID。外部查询然后选择作为该结果的任何component.id。不管它在那里是一次还是1000次,它只会得到一次组件记录


执行此操作的其他方法是使用EXISTS子查询或使用查询的联接,但您确实需要对其进行重复数据消除

我测试了此方法,它确实有效。然而,我不明白它为什么或者如何工作。我想知道为什么。我想我知道发生了什么。子查询只是生成一个widget_component.component_id的记录集,其中主查询基本上是测试component.id=widget_component.component_id。有点像php中的foreach循环,但使用记录集。这听起来正确吗?仅供参考:在MS Access中运行此SQL代码时有一个小问题。出于某种原因,在SSMS上它返回正确的结果集,但在Access中它返回一个结果集,就好像WHERE子句不存在一样。我不知道为什么会这样。我还必须编写一些奇怪的查询,让它在访问中提供与SQL Server相同的结果。我想我理解为什么wc.widget_id会导致重复。我想知道为什么使用字段名而不是。*是更好的做法,特别是当表中有大量可用字段时。星号问题与SQL Server执行查询的方式有关-一般来说,星号会导致全表扫描,从而排除索引带来的性能好处;通过使您通过连接等传递更多不需要的数据字段,其他数据库服务器比SQL Server更好地解决了一些性能问题,但在某种程度上似乎总是会影响您的性能。此外,如果列出字段,您将在开发方面做得更好—仔细思考您的查询,打算让它做什么,等等。不管好坏