English 中文(简体)
MS 存取录音专辑
原标题:MS Access Distinct Records in Recordset

因此,我似乎再次对MSA Access的缺陷有疑问,尽管在SSMS(SQL服务器管理工作室)尝试类似查询时,这似乎也是一个问题。

我有一套表格,大致定义如下:

  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), ... } -- There are ~25 columns in this table

我想做的是查询数据库,并获得一个特定制造商使用的所有部件的清单。

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一般都不太擅长。 我知道基本知识,但除了这些,我还不知道很多。

编辑 :

我刚刚尝试了这个代码, 它的工作是将全部组件. id s 都限制在单个条目内。 我该如何使用它的结果来获取一份所有组件数据( part. *) 的列表, 其中第一部分的 id s 用于选择此数据?

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

最佳回答

What I d like to do is query the database and get a list of all components that a specific manufacturer uses

这样做有几种方法。

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 子查询会找到特定制造商使用的所有部件代号。 外部查询会选择任何部件代号, 即结果。 不论它放在那里一次还是千次, 它只会得到一次组件记录 。

这样做的其他方式是使用 EXDISTS 子查询或使用连接到查询(但随后您需要将其拆卸)

问题回答

听起来你的部件 - 对部件的关系是一对多。 因此重复。 (即同一个部件被不止一个部件使用) 。

您的选择几乎可以 --

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

wc.widget_id 却造成重复(根据上述假设)。

因此,从 SELECT 中删除