Итак, у меня снова возникает проблема с MS Access, но это, похоже, также является проблемой при попытке подобных запросов в SSMS (SQL Server Management Studio).MS Access Отдельные записи в Recordset
У меня есть набор таблиц, свободно определяется следующим образом:
- таблица widget_mfg {идентификатор (целое), имя (NVARCHAR)}
- таблица виджет {идентификатор (целое), имя (NVARCHAR) , mfg_id (интермедиат)}
- таблица widget_component {идентификатор (целое), имя (NVARCHAR), WIDGET_ID (INT), component_id}
- таблица компонент {идентификатор (целое), имя (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 вообще. Я знаю основы, но не так уж много.
Edit:
Я просто попробовал этот код, и она работает, чтобы получить все 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)))
(постскриптум это, вероятно, не самый лучший способ сделать это, но я все еще учусь SQL.)
Я тестировал это, и он действительно работает. Однако я не понимаю, почему и как это работает. Я хотел бы понять, почему. –
@JimP Я обновил свой ответ, чтобы попытаться объяснить его. –
Думаю, я вижу, что происходит. Подзапрос просто создает набор записей widget_component.component_id, в котором основной запрос в основном тестирует component.id = widget_component.component_id. Вид вроде цикла foreach в php, но с набором записей. Звучит ли это правильно? –