2

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

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

  1. 表 widget_mfg { id (int), name (nvarchar) }
  2. 表小部件 { id (int), name (nvarchar), mfg_id (int) }
  3. 表 widget_component { id (int), name (nvarchar), widget_id (int), component_id }
  4. table component { 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

前面的示例显示了包含在不同小部件的多个 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,同时将它们限制为一个条目。如何使用此结果获取所有其余组件数据(component.*)的列表,其中第一部分的 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)))

(PS 这可能不是最好的方法,但我仍在学习 SQL。)

4

2 回答 2

1

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

你的 Select 几乎没问题——

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,通常使用字段名称而不是 *

于 2012-05-23T16:21:50.703 回答
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 子查询或使用查询连接(但您确实需要对其进行重复数据删除)

于 2012-05-23T16:21:52.113 回答