2014-06-30 2 views
0

Я пытаюсь сделать полное внешнее соединение из 3 таблиц и пошел логику делать два стола FOJ из hereMS Access - полное внешнее соединение с 3 таблицами

Таким образом, вместо того, чтобы делать UNION на 3 запроса (например, я бы использовал две таблицы), я сделал 7 запросов для объединения. Я уверен, что это действительно неэффективно, но я впервые использую Access.

В принципе, у меня есть таблица с информацией о текущих долларах. Со спецификациями на то, на что они были потрачены (номер ID), кто их предоставил (числовой код), и кто их получил (другой номер кода). Остальные две таблицы имеют аналогичные спецификации, но один показывает, что, как прогнозируется, будет потрачено, а другое из того, что изначально было предусмотрено в бюджете.

Я смог сделать FOJ из двух столов и получить точные цифры, но у меня проблемы с трехсторонним FOJ.

Бывают случаи, когда в фактической таблице для конкретного идентификатора, кода провайдера и кода получателя могут быть потрачены 3 записи долларов, в то время как в таблице «Прогноз» может быть 2, а в таблице бюджета , 1. По сути, нет никакой гарантии, что для каждой комбинации идентификатора номера, кода поставщика, кода получателя в трех таблицах имеется одинаковое количество записей.

Чтобы убедиться, что запись не будет размножаться, я сделал запрос по 3 таблицам отдельно и выполнил функцию Group By. И 7 запросов, которые я сделал, были следующими:

Таблица 1: Фактическое внутреннее соединение ж/Прогноз & внутреннее соединение W/B

Таблица 2: F внутреннее соединение W/B & F влево внешнее соединение с А (где А представляет собой нуль)

Таблица 3: F внутреннее соединение W/A & F левое внешнее соединение W/B (где в нуль)

Таблица 4: Б внутреннее соединение W/A & В левое внешнее соединение ж/F (где F является нулем)

Таблица 5: левое внешнее соединение W/B (где В Нуль) & левое внешнее соединение ж/F (где F является нулем)

Таблица 6: в левое внешнее соединение W/A (где А представляет собой нуль) & в левое внешнее соединение ж/F (где F является нулевым)

Таблица 7: F левое внешнее соединение w/B (где B является нулевым) & F левое внешнее соединение w/A (где A является нулевым)

Может ли кто-нибудь пройти через меня, как сделать 3-столовое полное внешнее соединение? Есть ли какая-то комбинация, которую мне не хватает? К сожалению, я не могу опубликовать таблицы или дать слишком много спецификации, потому что мне не разрешено. Я также не могу изменить сами таблицы, у меня в основном есть только разрешение на чтение.

ответ

0

Вы можете использовать union и последовательности left outer join s. Я думаю, что 3 сделают, но вам может понадобиться 6.Вот эскиз SQL:

select * 
from A left outer join B left outer join C 
union 
select * 
from B left outer join C left outer join A 
union 
select * 
from C left outer join A left outer join B; 

Вы, возможно, потребуется расширить это, в зависимости от условий:

select * 
from A left outer join B left outer join C 
union 
select * 
from B left outer join C left outer join A 
union 
select * 
from C left outer join A left outer join B 
union 
select * 
from A left outer join C left outer join B 
union 
select * 
from B left outer join A left outer join C 
union 
select * 
from C left outer join B left outer join A; 

Однако оба они, кажется, как на самом деле плохие идеи. Вместо этого, просто создать временную таблицу с идентификаторами из всех трех таблиц:

select id into ids 
from A 
union 
select id 
from b 
union 
select id 
from c; 

Затем используйте left outer join:

select * 
from ids left join A left join B left join C; 

Или, еще лучше. Обновите базу данных, такую ​​как SQL Server Express (также бесплатно), которая поддерживает более мощные функции SQL.

+0

Просто для пояснения в виде проекции MS Access. Левое внешнее соединение. Влево внешнее соединение C будет выглядеть так: A -> B -> C? К сожалению, еще одно ограничение заключается в том, что на таблицах нет идентификаторов, и я не могу их добавить. Я посмотрю на SQL Server Express, есть ли у них функция Full Outer Join? – user3783314

+0

@ пользователь3783314. , , Он не только поддерживает «полное внешнее соединение», но вы также можете использовать 'union' в подзапросах и поддерживает CTE. Последнее также может быть полезно для этого типа запросов. –

+0

Кроме того, почему вы говорите, что это плохие идеи? Я имею в виду, очевидно, что есть лучшие способы сделать то, что я делаю, но, учитывая ограничения, с которыми я сталкиваюсь, я просто хотел понять, насколько хорошо/плохо решение, которое оно должно делать, что вы предложили (если я могу использовать только Access) – user3783314

Смежные вопросы