Как объединить 4 таблицы в Microsoft Access с одной таблицы в качестве базы? - PullRequest
2 голосов
/ 22 декабря 2009

Я осмотрелся и не нашел в Интернете ничего, указывающего мне правильное направление, поэтому я попробую знающих людей, использующих стекирование:)

У меня есть 4 таблицы в Microsoft Access 2007 (Warehouse, Cars, TVs, Toys).

            __(many) Cars
           /
Warehouse 1---(many) TVs
           \__(many) Toys

Таблица Warehouse имеет отношение 1-ко-многим к автомобилям, телевизорам, игрушкам в поле WarehouseNumber. Я пытался сделать запрос, который дал бы мне сумму Dollar Value (это поле в Cars, Телевизоры и столы для игрушек). Я делаю это с Джоинсом, но, возможно, это неправильный путь. Я знаю только основы соединений, но никогда раньше не работал с ними.

Сначала я пытаюсь получить непонятные записи на основе значения поля Warehouse.WarehouseNumber, например:

SELECT Warehouse.[WarehouseNumber], Cars.[DollarValue], TVs.[DollarValue]
FROM (Warehouse INNER JOIN Cars
      ON Warehouse.[WarehouseNumber] = Cars.[WareHouseNumber])
INNER JOIN TVs ON TVs.[WarehouseNumber] = TVs.[WarehouseNumber];

Но я получаю такие повторяющиеся записи (это просто фиктивные данные):

WarehouseNumber | Cars.DollarValue | TVs.DollarValue
1111-1111       |        $8,000.00 |         $500.00 
1111-1111       |        $8,000.00 |         $800.00 
1111-1111       |                  |         $500.00 
1111-1111       |                  |         $800.00 
1111-3333       |    $1,000,000.00 |                 
1111-3333       |       $21,000.00 |                   

Есть ли лучший способ сделать это? Заранее спасибо за помощь

ОБНОВЛЕНИЕ: Я дал ответ Рему за простоту в запросе и за то, что был первым, но все примеры до сих пор не дали мне повторяющихся записей. Спасибо за быструю помощь, ребята, вы делаете доступ более терпимым для меня.

Ответы [ 5 ]

3 голосов
/ 22 декабря 2009

Я предлагаю вам использовать объединенный запрос для игрушек, автомобилей и телевизоров. Вам может не понадобиться склад, если все, что вам нужно, это значение.

SELECT DollarValue FROM Cars
UNION ALL
SELECT DollarValue FROM TVs
UNION ALL
SELECT DollarValue FROM Toys

Если вам нужен итог, вы можете получить его так:

SELECT Sum(DollarValue) FROM (
SELECT DollarValue FROM Cars
UNION ALL
SELECT DollarValue FROM TVs
UNION ALL
SELECT DollarValue FROM Toys ) A

Вы также можете иметь:

SELECT Product, Sum(DollarValue) FROM (
SELECT "Cars" As Product, DollarValue FROM Cars
UNION ALL
SELECT "TVs" As Product, DollarValue FROM TVs
UNION ALL
SELECT "Toys" As Product, DollarValue FROM Toys ) A
GROUP BY Product
2 голосов
/ 22 декабря 2009

Является ли союз более подходящим для вас

SELECT Warehouse.[WarehouseNumber], Cars.[DollarValue] AS DollarValue, 'Car' as Type
FROM Warehouse INNER JOIN Cars
      ON Warehouse.[WarehouseNumber] = Cars.[WareHouseNumber]
UNION ALL
SELECT Warehouse.[WarehouseNumber], TVs.[DollarValue] AS DollarValue, 'TV' as Type
FROM Warehouse INNER JOIN TVs
      ON Warehouse.[WarehouseNumber] = TVs.[WareHouseNumber]
--etc....

Это создаст набор записей, содержащий

WarehouseNumber, DollarValue, Тип

1 голос
/ 23 декабря 2009

Это звучит как плохой дизайн для меня. Должна быть таблица типов товаров с данными о стоимости игрушек, автомобилей и телевизоров. Затем столы с игрушками, автомобилями и телевизорами следует объединить в один стол, называемый продуктами. И теперь вам вообще не нужен запрос на объединение.

В конце концов, что произойдет, когда вы решите начать носить холодильники, стереосистемы и радарные детекторы? Еще столы? Не очень хорошая идея.

1 голос
/ 22 декабря 2009

Попробуйте три запроса, один для автомобилей, один для телевизоров и один для игрушек. Убедитесь, что все они имеют одинаковые столбцы. Вы можете присоединиться к трем запросам с объединением. Вы можете добавить «статический» столбец к каждому запросу, чтобы знать, является ли значение автомобилем, телевизором или игрушкой.

select warehouse[WarehouseNumber], 'Car', Cars.[DollarVallue]
FROM (Warehouse INNER JOIN Cars
      ON Warehouse.[WarehouseNumber] = Cars.[WareHouseNumber])
union 
select warehouse[WarehouseNumber], 'TV', TVs.[DollarVallue]
FROM (Warehouse INNER JOIN Cars
      ON Warehouse.[WarehouseNumber] = TVs.[WareHouseNumber])
0 голосов
/ 22 декабря 2009

Вы должны использовать СЛЕДУЮЩИЕ СОЕДИНЕНИЯ и SUM / GROUP BY

Что-то вроде

SELECT  Warehouse.[WarehouseNumber], 
        SUM(Cars.[DollarValue]) SumOfCars, 
        SUM(TVs.[DollarValue]) SumOfTvs
FROM    (Warehouse LEFT JOIN Cars      ON Warehouse.[WarehouseNumber] = Cars.[WareHouseNumber])
        LEFT  JOIN TVs ON TVs.[WarehouseNumber] = TVs.[WarehouseNumber]
GROUP BY Warehouse.[WarehouseNumber];

Затем вы можете распространить это на третий случай (Игрушки).

...