所以,我再一次似乎有一个问题,MS Access是挑剔的,虽然在SSMS(SQL Server Management Studio)中尝试类似的查询似乎也是一个问题。
我有一组表,松散定义如下:
我想要做的是查询数据库并获取特定制造商使用的所有组件的列表。我尝试过其中一些查询:
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。)
答案 0 :(得分:1)
听起来你的组件与小部件的关系是一对多的。因此重复。 (即,同一个组件由多个小部件使用)。
你的选择几乎没问题 -
SELECT c.*, wc.widget_id, w.mfg_id
但wc.widget_id
导致重复(根据上述假设)。
请从wc.widget_id
移除SELECT
,否则将其汇总(min
,max
,count
等。删除更容易。如果您进行了重新聚合,请记住添加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子查询或使用连接查询(但是您确实需要对其进行重复数据删除)