MS Access Recordset中的独特记录

时间:2012-05-23 16:12:20

标签: sql ms-access

所以,我再一次似乎有一个问题,MS Access是挑剔的,虽然在SSMS(SQL Server Management Studio)中尝试类似的查询似乎也是一个问题。

我有一组表,松散定义如下:

  1. table widget_mfg {id(int),name(nvarchar)}
  2. table widget {id(int),name(nvarchar),mfg_id(int)}
  3. table widget_component {id(int),name(nvarchar),widget_id(int),component_id}
  4. table component {id(int),name(nvarchar),...} - 此表中有~25列
  5. 我想要做的是查询数据库并获取特定制造商使用的所有组件的列表。我尝试过其中一些查询:

    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
    

    上一个示例显示了不同小部件的多个widget_component列表中包含的任何部分的重复项。

    我也尝试过:

    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)))
    

    (P.S。这可能不是最好的方法,但我还在学习SQL。)

2 个答案:

答案 0 :(得分:1)

听起来你的组件与小部件的关系是一对多的。因此重复。 (即,同一个组件由多个小部件使用)。

你的选择几乎没问题 -

SELECT c.*, wc.widget_id, w.mfg_id

wc.widget_id导致重复(根据上述假设)。

请从wc.widget_id移除SELECT,否则将其汇总(minmaxcount等。删除更容易。如果您进行了重新聚合,请记住添加group by子句。

试试这个:

SELECT DISTINCT c.*, w.mfg_id

另外 - FWIW,使用字段名称通常是更好的做法,而不是*

答案 1 :(得分:1)

  

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

有几种方法可以做到这一点。 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子查询或使用连接查询(但是您确实需要对其进行重复数据删除)

相关问题