2013-03-12 4 views
0

Я создаю базу данных, содержащую компоненты для транспортных средств. Есть три таблицы:Как запустить SQL-запрос на нескольких таблицах

  • автомобиля Таблица (Перечень транспортных средств, где каждое транспортное средство имеет уникальный идентификационный номер)
  • Покрышки Table (Lists серийный номер (SN) и номер детали (PN) для шин вместе с транспортное средство, которое он установлен на (ID))
  • Filter Table (списки серийный номер (SN) и номер детали (PN) для фильтров вместе с транспортным средством, что он установлен (ID))

я бы например, создать запрос SQL Access, который извлекает серийные номера и номера деталей для всех фильтров и шины, установленные на определенном носителе (предположим, что мы ищем Honda Civic с идентификатором автомобиля 5). Я создал следующий код, но он возвращает декартово произведение всех результатов. На каждом транспортном средстве установлены два фильтра и две шины, поэтому он возвращает следующие результаты, где результаты объединяются и дублируются.

  • Шины 1 (PN и SN) | Фильтр 1 (PN и SN)
  • Шина 1 (PN и SN) | Фильтр 2 (PN и SN)
  • Шина 2 (PN и SN) | Фильтр 1 (PN и SN)
  • Шина 2 (PN и SN) | Фильтр 2 (PN и SN)

Есть в любом случае, что я могу создать запрос, который возвращает:

  • шин 1 (PN и SN)
  • шин 2 (PN и SN)
  • фильтр 1 (PN и SN)
  • фильтр 2 (PN и SN)

Мой код ниже:

SELECT DISTINCT Tires.SN, Tires.PN, Tires.ID, Filters.ID, Filters.PN, Filters.SN, 
Vehicle.ID 
FROM (Vehicle 
INNER JOIN Filters ON Vehicle.[ID] = Filters.[ID]) 
INNER JOIN Tires ON Vehicle.[ID] = Tires.[ID] 
WHERE Vehicle.[ID] = 5; 

Спасибо!

+0

Ваши данные не совсем нормализованы, так как шины и filgers имеют те же данные в них (по крайней мере, с вашим примером, лучше всего иметь только одну таблицу и определить, является ли компонент «шиной» или «фильтром» таким образом, что вам не нужно выбирать из обоих. Кроме того, если вы решите добавить «ремни» позже, вам не нужно писать больше запросов, данные будут вытеснять дополнительные компоненты. – xQbert

+0

Чтобы ответить на ваш вопрос, хотя это можно сделать с использованием текущей схемы, однако мы должны сделать assu что всегда имеется 2 шины и 2 фильтра на автомобиль, а нижний идентификатор фильтра привязан к нижнему идентификатору шины для того же автомобиля. Если вы собираетесь масштабировать базу данных с течением времени, это будет становиться все сложнее и сложнее. – xQbert

+0

Зачем вам нужны столбцы? Это не масштабируется, как сказал xQbert. Просто выберите их как строки, объединяющие результирующие наборы. – peterm

ответ

0

Если вы действительно это нужно только для одного значения Vehicle.ID, то вы можете использовать запрос с UNION, как это:

SELECT 'Tire',Tires.SN, Tires.PN 
FROM Tires 
WHERE Vehicle.[ID]=5 
UNION 
SELECT 'Filter',Filters.PN, Filters.SN 
FROM Filters 
WHERE Vehicle.[ID]=5 
ORDER BY 1; 
Смежные вопросы