Access

Как объединить таблицы в access – Объединение таблиц и запросов — Access

Содержание

Объединение таблиц и запросов — Access

Примечание: Мы стараемся как можно оперативнее обеспечивать вас актуальными справочными материалами на вашем языке. Эта страница переведена автоматически, поэтому ее текст может содержать неточности и грамматические ошибки. Для нас важно, чтобы эта статья была вам полезна. Просим вас уделить пару секунд и сообщить, помогла ли она вам, с помощью кнопок внизу страницы. Для удобства также приводим ссылку на оригинал (на английском языке).

При включении нескольких источников данных в запрос Access вы можете использовать соединения для отбора записей, которые нужно просмотреть, в зависимости от того, как источники данных связаны друг с другом. Соединения также используются для объединения записей из источников данных, так что каждая пара записей из источников становится одной записью в результатах запроса.

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

Примечание: Вы можете присоединяться к запросам таким же образом, как и к таблицам, а также присоединяться к ним.

В этой статье

Обзор

Типы соединений

Показывать строки, в которых есть общее значение в обеих Объединенных таблицах

Показать все строки из одной таблицы и соответствующие строки другой таблицы

Показать все строки из обеих таблиц и присоединиться к ним, где есть общее значение

Перекрестные соединения

Объединение таблиц на основе неравенства значений полей

Удаление соединения

Обзор

База данных — это набор таблиц с данными, которые являются логическими связями друг с другом. Связи используются для соединения таблиц с помощью полей, которые они используют чаще всего. Таблица может быть частью любого количества связей, но каждая связь всегда имеет ровно две таблицы. В запросе связь представляется соединением.

При добавлении таблиц в запрос Access создает соединения, основанные на отношениях, заданных между таблицами. Вы можете вручную создавать соединения в запросах, даже если они не представляют собой связи, которые уже были определены. Если вы используете другие запросы (вместо или в дополнение к таблицам) в качестве источников данных для запроса, вы можете создавать соединения между исходными запросами, а также между этими запросами и таблицами, которые используются в качестве источников данных.

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

Существует четыре основных типа соединений: внутренние соединения, внешние соединения, перекрестные соединения и неодинаковые соединения. В этой статье рассказывается о каждом типе соединения, который можно использовать, зачем использовать каждый из них, а также создавать соединения.

Соединения предназначены для запроса связей с таблицами: сведения о том, как данные в двух источниках можно сочетать на основе значений данных, которые они используют. Ниже приведена иллюстрация соединения в режиме конструктора запросов с диалоговым окном свойств соединения, которое открывается в окне.

Эта строка между таблицами представляет соединение. Дважды щелкните соединение, чтобы открыть диалоговое окно Свойства соединения (показано) и просмотреть или изменить соединение.

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

В этой области определяется тип соединения: вариант 1 — это внутреннее соединение, 2 — левое внешнее соединение, а 3 — правое внешнее соединение.

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

К началу страницы

Типы соединений

Существует четыре основных типа соединений: внутренние соединения, внешние соединения, перекрестные соединения и неодинаковые соединения. Перекрестные соединения и неодинаковые соединения — это сложные типы объединений, которые редко используются, но вам следует знать, чтобы они могли понять, как работают соединения.

Внутренние соединения: объединены только связанные данные из обеих таблиц.

Внутреннее соединение — это один из них, в котором Access включает только данные из таблицы, если есть соответствующие данные в связанной таблице, и наоборот. В большинстве случаев вы будете использовать внутреннее соединение. Если вы создаете соединение и не указали тип соединения, то Access считает, что вы хотите использовать внутреннее соединение. Внутренние соединения удобны, так как они позволяют объединять данные из двух источников на основе общих значений, так что вы видите данные только при полном рисунке.

Внешние соединения: все связанные данные правильно объединены и все оставшиеся записи из одной таблицы

Внешнее соединение аналогично внутреннему соединению, но суммирует оставшиеся строки из одной из таблиц. Внешние соединения являются направленными: левое внешнее соединение включает в себя все записи из левой таблицы — первая таблица в соединении — и правое внешнее соединение включает все записи из таблицы справа — Вторая таблица в соединении.

Полные внешние соединения: все данные, в сочетании с возможными возможностями

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

Перекрестные соединения: все данные объединены каждый из возможных способов

В большинстве случаев перекрестное соединение является побочным эффектом добавления двух таблиц в запрос и последующего их присоединения. Access считает это таким образом, что вы хотите, чтобы все записи из одной таблицы отображались вместе с каждой записью из другой таблицы — каждое из возможных сочетаний записей. Поскольку никакие данные нельзя объединять, этот вариант соединения редко дает полезные результаты. Однако существует несколько случаев, когда перекрестное соединение является именно тем, что вам нужно.

Объединение по несовпадению: как обычное соединение, но с использованием другого сравнения для объединения строк

Соединения «неодинаковые» используют оператор, отличный от знака равенства (=), для сравнения значений и определения того, следует ли комбинировать данные. Неодинаковые соединения не поддерживаются явно, но вы можете использовать перекрестное соединение и условия для достижения такого эффекта.

Показывать строки, в которых есть общее значение в обеих Объединенных таблицах

Если вы хотите, чтобы в присоединенном поле отображались только те строки, которые содержат совпадающие значения, используется внутреннее соединение. Microsoft Access автоматически создает внутреннее соединение.

Внутреннее объединение — это самый распространенный тип объединения. Они указывают на то, что строки из одной из Объединенных таблиц соответствуют строкам другой таблицы на основе данных в Объединенных полях. При выполнении запроса с внутренним соединением в операции запроса будут включены только те строки, в которых есть общее значение в обеих Объединенных таблицах.

Как использовать внутреннее соединение?

В большинстве случаев вам не нужно ничего делать, чтобы использовать внутреннее соединение. Если таблицы, добавленные в запрос, уже имеют отношения, Access автоматически создает внутреннее соединение между каждой парой связанных таблиц при добавлении таблиц. Если используется целостность данных, Access также отображает «1» над линией соединения, чтобы показать, какая таблица находится на стороне «один» элемента отношение «один-ко-многим» и символ бесконечности (

), чтобы показать, какая таблица находится на стороне «многие».

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

Если вы добавите запросы в запрос и не создали связь между этими запросами, Access не будет автоматически создавать внутренние соединения между этими запросами или между запросами и таблицами. Как правило, вы должны создать их самостоятельно. Вы можете создать внутреннее соединение, перетащив поле из одного источника данных в поле другого источника данных. Access добавит линию между двумя полями, чтобы показать, что они соединены.

Синтаксис SQL для внутреннего соединения

Внутренние соединения задаются в SQL в предложении FROM, как показано ниже.

FROM таблица1 INNER JOIN таблица2 ON таблица1.field1 сравнить Table2.поле2

Операция INNER JOIN состоит из следующих элементов:

Часть

Описание

таблица1, таблица2

Имена таблиц, содержащих объединяемые записи.

поле1, поле2

Имена Объединенных полей. Если они не являются числовыми, поля должны быть одного и того же тип данных и содержать данные одного и того же типа, но они не должны иметь одинакового имени.

compare

Любой оператор сравнения: (=, <, >, <=, >= или <>)

Дополнительные сведения о синтаксисе INNER JOIN можно найти в разделе Операция INNER JOINдля темы.

К началу страницы

Показать все строки из одной таблицы и соответствующие строки другой таблицы

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

Внешние соединения могут быть левыми внешними соединениями или раздельными внешними соединениями. В левом внешнем соединении запрос включает все строки из первой таблицы в предложении SQL FROM, и только те строки из другой таблицы, в которых присоединено поле, содержащее значения, которые являются общими для обеих таблиц. В правом внешнем соединении запрос включает все строки из второй таблицы в предложении SQL FROM, и только те строки из другой таблицы, в которых присоединено поле, содержащее значения, которые являются общими для обеих таблиц.

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

Так как некоторые строки на одной стороне внешнего соединения не будут содержать соответствующие строки из другой таблицы, некоторые поля, возвращенные в результатах запроса из этой таблицы, будут пустыми, если строки не соответствуют друг другу.

Как использовать внешнее соединение?

Вы создаете внешнее соединение, изменяя существующее внутреннее соединение. Если внутреннее соединение не существует, создайте его, а затем измените на внешнее соединение.

Изменение внутреннего объединения на внешнее соединение
  1. В режиме конструктора запроса дважды щелкните соединение, которое вы хотите изменить.

    Откроется диалоговое окно Параметры соединения.

  2. В диалоговом окне Свойства объединения Обратите внимание на варианты, указанные в разделе Параметры 2 и 3.

  3. Выберите нужный вариант и нажмите кнопку ОК.

  4. Приложение Access выведет соединение и отобразит стрелку, указывающую на источник данных, в который будут включены все строки, в которых будут включены только те строки, которые удовлетворяют условию соединения.

Неоднозначные внешние соединения

Если вы создаете запрос с левым СОЕДИНЕНИЕм и ВНУТРЕННим СОЕДИНЕНИЕм, Access не сможет определить, какую операцию соединения нужно выполнить в первую очередь. Так как результаты различаются в зависимости от того, выполняется ли левое соединение или внутреннее соединение, Access выводит сообщение об ошибке:

Чтобы исправить эту ошибку, измените запрос так, чтобы он не был понятен для выполнения первой операции.

Синтаксис SQL для внешнего соединения

Внешние соединения задаются в SQL в предложении FROM, как показано ниже.

FROM Таблица1 [Left | RIGHT] Join Таблица2
для Table1. field1 Compare Table2. поле2

Операции LEFT JOIN и RIGHT JOIN состоят из следующих элементов:

Часть

Описание

таблица1, таблица2

Имена таблиц, содержащих объединяемые записи.

поле1, поле2

Имена Объединенных полей. Поля должны быть одного и того же тип данных и содержать данные одного и того же типа, но они не должны иметь одинакового имени.

compare

Любой оператор сравнения: (=, <, >, <=, >= или <>)

Дополнительные сведения о синтаксисе OUTER JOIN можно найти в разделе Выполнение операций соединения LEFT JOIN и RIGHT JOIN.

К началу страницы

Показать все строки из обеих таблиц и присоединиться к ним, где есть общее значение

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

Использование запроса на объединение для выполнения полного внешнего соединения:

  1. Создайте запрос, который содержит левое внешнее соединение в поле, которое вы хотите использовать для полного внешнего объединения.

  2. На вкладке Главная в группе Режимы выберите команду Режим, а затем — Режим SQL.

  3. Нажмите клавиши CTRL + C, чтобы скопировать код SQL.

  4. Удалите точку с запятой в конце предложения FROM и нажмите клавишу ВВОД.

  5. Введите слово UNION и нажмите клавишу ВВОД.

    Примечание: Не используйте ключевое слово ALL при выполнении полного внешнего соединения с помощью запроса на объединение.

  6. Нажмите клавиши CTRL + V, чтобы вставить код SQL, скопированный в действии 3.

  7. В коде, который вы вставили, измените левое соединение на right.

  8. Удалите точку с запятой в конце второго предложения FROM и нажмите клавишу ВВОД.

  9. Добавьте предложение WHERE, которое указывает, что значение поля соединения равно NULL в первой таблице, указанной в предложении FROM (Левая таблица).

    Например, если предложение FROM имеет следующее:

    FROM Products RIGHT JOIN [Order Details] 
    ON Products.ID = [Order Details].[Product ID]

    Вы добавите следующее предложение WHERE:

    WHERE Products.ID IS NULL

  10. Введите точку с запятой (;) в конце предложения WHERE, чтобы обозначить конец запроса на объединение.

  11. На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить.

Перекрестные соединения

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

Зачем использовать перекрестное соединение?

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

Как использовать перекрестное соединение?

Перекрестное соединение создается, когда вы включаете в запрос таблицы или запросы и не создаете по крайней мере одно явное соединение для каждой таблицы или запроса. Microsoft Access объединяет все строки из каждой таблицы или запроса, которые не были явно объединены с другими таблицами или запросами в другие строки результатов. Рассматривайте ситуацию с бонусом из предыдущего абзаца. Предположим, что у вас есть клиенты 91 и хотите просмотреть пять возможных процентов бонусов. Перекрестное соединение формирует строки 455 (произведение 91 и 5).

Как вы можете представить, непреднамеренное перекрестное соединение может создать огромное количество строк в результатах запроса. Кроме того, эти результаты, как правило, не имеют смысла, так как если вам действительно не нужно объединять каждую строку с каждой другой строкой, большинство Объединенных строк, которые отображаются в результатах, не будут иметь смысла. Наконец, выполнение запросов, использующих непреднамеренное перекрестное соединение, может занять очень много времени.

1. поля с кругами должны быть соединены друг с другом.

1. Обратите внимание на очень большое количество записей.

1. Обратите внимание на то, что количество записей гораздо меньше.

К началу страницы

Объединение таблиц на основе неравенства значений полей

Соединения не должны основываться на эквивалентности Объединенных полей . Соединение может быть основано на любом операторе сравнения, например больше (_гт_), меньше чем (_лт_), или не равно (_лт__гт_). Соединения, не основанные на эквивалентности, называются неравенствными соединениями.

Если вы хотите объединить строки из двух источников данных на основе значений полей, которые не равны, используйте соединение по несовпадению. Как правило, соединения на неодинаковые значения зависят от значений операторов сравнения «больше (_гт_)», «меньше» (_лт_), «больше» или «равно» (_гт_ =) или меньше или равно (_лт_ =). Неодинаковые соединения, основанные на операторе is Not Equals (_лт__гт_), могут возвращать практически столько строк, сколько перекрестное соединение, и результаты могут быть трудно интерпретировать.

Как использовать соединение по несовпадению?

Соединения «неодинаковые» в конструкторе не поддерживаются. Если вы хотите использовать их, необходимо выполнить эти действия с помощью режима SQL. Однако вы можете создать соединение в конструкторе, перейти в режим SQL, найти оператор равенства (=), а затем изменить его на оператор, который вы хотите использовать. После этого вы можете снова открыть запрос в конструкторе, если сначала изменить оператор сравнения на равно (=) в режиме SQL.

Удаление соединения

Если Access автоматически создает соединение, которое вы не хотите, или вы создаете соединение по ошибке, например соединение между двумя полями, которые имеют непохожие типы данных, вы можете удалить соединение.

  1. В бланке запроса щелкните соединение, которое вы хотите удалить.

  2. Нажмите клавишу Delete.

-или-

  • В бланке запроса щелкните соединение, которое нужно удалить, правой кнопкой мыши и выберите команду Удалить.

К началу страницы

См. также

Добавление записей в таблицу с помощью запроса на добавление

Объединение результатов нескольких запросов на выборку с помощью запроса на объединение

Создание запроса на основе нескольких таблиц

Создание, изменение и удаление связи

support.office.com

Просмотр результатов нескольких запросов с помощью запроса на объединение

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

Чтобы понять, как это работает, воспользуемся запросом Операции с товарами в образце базы данных «Борей». Откройте в этой базе данных запрос «Операции с товарами» в режиме таблицы. Последние 10 записей должны выглядеть примерно так:

ИД товара

Дата размещения

Название

Операция

Количество

77

22.01.2006

Поставщик Б

Закупка

60

80

22.01.2006

Поставщик Г

Закупка

75

81

22.01.2006

Поставщик А

Закупка

125

81

22.01.2006

Поставщик А

Закупка

200

7

20.01.2006

Организация Г

Продажа

10

51

20.01.2006

Организация Г

Продажа

10

80

20.01.2006

Организация Г

Продажа

10

34

15.01.2006

Организация Э

Продажа

100

80

15.01.2006

Организация Э

Продажа

30

Предположим, что вы хотите разделить поле «Количество» на два — для закупок и продаж. Также допустим, что вместо пустых полей вы хотите использовать статическое значение 0. Вот какой код SQL нужно ввести для этого запроса на объединение:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], 0 As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, 0 As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC; 

В режиме таблицы 10 последних записей теперь выглядят следующим образом:

ИД товара

Дата размещения

Название

Операция

Закупка

Продажа

74

22.01.2006

Поставщик Б

Закупка

20

0

77

22.01.2006

Поставщик Б

Закупка

60

0

80

22.01.2006

Поставщик Г

Закупка

75

0

81

22.01.2006

Поставщик А

Закупка

125

0

81

22.01.2006

Поставщик А

Закупка

200

0

7

20.01.2006

Организация Г

Продажа

0

10

51

20.01.2006

Организация Г

Продажа

0

10

80

20.01.2006

Организация Г

Продажа

0

10

34

15.01.2006

Организация Э

Продажа

0

100

80

15.01.2006

Организация Э

Продажа

0

30

Но что если мы хотим, чтобы вместо нулей отображались пустые поля? Можно попробовать изменить код SQL, добавив ключевое слово Null следующим образом:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

Однако в режиме таблицы будет выведен неожиданный результат. В столбце «Закупка» все поля будут пустыми:

ИД товара

Дата размещения

Название

Операция

Закупка

Продажа

74

22.01.2006

Поставщик Б

Закупка

 

 

77

22.01.2006

Поставщик Б

Закупка

 

 

80

22.01.2006

Поставщик Г

Закупка

 

 

81

22.01.2006

Поставщик А

Закупка

 

 

81

22.01.2006

Поставщик А

Закупка

 

 

7

20.01.2006

Организация Г

Продажа

 

10

51

20.01.2006

Организация Г

Продажа

 

10

80

20.01.2006

Организация Г

Продажа

 

10

34

15.01.2006

Организация Э

Продажа

 

100

80

15.01.2006

Организация Э

Продажа

 

30

Это происходит потому, что Access определяет типы данных полей на основе первого запроса, а Null не является числом.

Что произойдет, если вставить вместо Null пустую строку, как в следующем коде SQL:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], "" As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, "" As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

В режиме таблицы вы увидите, что Access извлекает значения для столбца «Закупка», но преобразует их в текст (это можно определить по тому, что они выровнены по левому краю). Пустая строка в первом запросе не является числом, поэтому результаты выводятся таким образом. Кроме того, значения «Продажа» также преобразуются в текст, так как записи покупок содержат пустую строку.

ИД товара

Дата размещения

Название

Операция

Закупка

Продажа

74

22.01.2006

Поставщик Б

Закупка

20

 

77

22.01.2006

Поставщик Б

Закупка

60

 

80

22.01.2006

Поставщик Г

Закупка

75

 

81

22.01.2006

Поставщик А

Закупка

125

 

81

22.01.2006

Поставщик А

Закупка

200

 

7

20.01.2006

Организация Г

Продажа

 

10

51

20.01.2006

Организация Г

Продажа

 

10

80

20.01.2006

Организация Г

Продажа

 

10

34

15.01.2006

Организация Э

Продажа

 

100

80

15.01.2006

Организация Э

Продажа

 

30

Так как же решить эту проблему?

Можно принудительно потребовать, чтобы значение поля было числом, используя следующее выражение:


IIf(False, 0, Null)

Проверяемое условие (False) никогда не принимает значение True, а выражение всегда возвращает Null, но Access все равно оценивает два варианта выходных данных и решает, что они могут быть числами или значениями Null.

Вот как можно использовать это выражение в нашем примере:


SELECT [Product ID], [Order Date], [Company Name], [Transaction], IIf(False, 0, Null) As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

Обратите внимание на то, что второй запрос можно не изменять.

В режиме таблицы теперь будет правильный результат:

ИД товара

Дата размещения

Название

Операция

Закупка

Продажа

74

22.01.2006

Поставщик Б

Закупка

20

 

77

22.01.2006

Поставщик Б

Закупка

60

 

80

22.01.2006

Поставщик Г

Закупка

75

 

81

22.01.2006

Поставщик А

Закупка

125

 

81

22.01.2006

Поставщик А

Закупка

200

 

7

20.01.2006

Организация Г

Продажа

 

10

51

20.01.2006

Организация Г

Продажа

 

10

80

20.01.2006

Организация Г

Продажа

 

10

34

15.01.2006

Организация Э

Продажа

 

100

80

15.01.2006

Организация Э

Продажа

 

30

Кроме того, этот же результат можно получить, если добавить в начале запроса на объединение еще один запрос:

SELECT 
    0 As [Product ID], Date() As [Order Date], 
    "" As [Company Name], "" As [Transaction], 
    0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False

Для каждого поля Access возвращает статические значения определенного вами типа данных. Конечно же, выходные данные этого запроса не должны влиять на результаты, поэтому мы указываем для предложения WHERE значение False:

WHERE False

Этот фрагмент будет всегда иметь значение False, а запрос не будет ничего возвращать. Объединив его с существующим кодом SQL, мы получим окончательную инструкцию:

SELECT 
    0 As [Product ID], Date() As [Order Date], 
    "" As [Company Name], "" As [Transaction], 
    0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False

UNION

SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

Примечание: Объединенный запрос, показанный в этом примере, возвращает из базы данных «Борей» 100 записей, тогда как два отдельных запроса возвращают 58 и 43 записи (в общей сложности 101 запись). Причина этого расхождения заключается в том, что две записи не являются уникальными. Чтобы узнать, как решить эту проблему с помощью UNION ALL, см. раздел Работа с уникальными записями в запросах на объединение с помощью UNION ALL.

support.office.com

Microsoft Access. 26. Запросы на объединение таблиц

    Конечно, разрабатывая базу данных Вам потребуется создавать запросы не только из одной, а из двух и более таблиц. Разработку таких запросов желательно начинать не с конструктора запросов, а с детальной проработки схемы связей таблиц. В этом случае, Вам придется меньше времени потратить на подготовку самих запросов, т.к. ядро Access в этом случает будет автоматически формировать в конструкторе запросов связи между таблицами.
   Можно предложить 3 (наиболее употребительных) способа объединения таблиц.
   Во первых, с использованием слова WHERE.
   Во вторых, с использованием слов INNER[1], LEFT[2], RIGHT[3] и JOIN[4]
   В третьих, с использованием слова UNION[5]. 
Примеры использования приведены в таблице. Желательно их смотреть через проводник запросов файла la_query.mdb
НазваниеSQL — запрос
WHERE объединениеSELECT Курс.Дата, Сумма.Название, Сумма.Сумма, Курс.Курс FROM Курс, Сумма WHERE Курс.Дата = Сумма.Дата
INNER объединениеSELECT Курс.Дата, Сумма.Название, Сумма.Сумма, Курс.Курс, [Сумма]/[Курс] AS USD FROM Курс INNER JOIN Сумма ON Курс.Дата = Сумма.Дата
LEFT объединениеSELECT Курс.Дата, Сумма.Название, Сумма.Сумма, Курс.Курс, [Сумма]/[Курс] AS USD FROM Курс LEFT JOIN Сумма ON Курс.Дата = Сумма.Дата
RIGHT объединениеSELECT Курс.Дата, Сумма.Название, Сумма.Сумма, Курс.Курс, [Сумма]/[Курс] AS USD FROM Курс RIGHT JOIN Сумма ON Курс.Дата < Сумма.Дата
UNION объединениеSELECT Сумма.Название, Сумма.Сумма FROM [Сумма]
UNION SELECT «$ от » & Дата as Название, Курс as Сумма FROM [Курс]
    P.S. Домашнее задание.
   1. Большинство разработчиков используют при объединении таблиц только равенство полей, попробуйте задать в проводнике различные уcловия <, >, between для ключей. Это поможет Вам более детально разобраться в структуре запросов.
   2. При решении задачи в предыдущем уроке невозможно создать запрос с использованием всех предложенных слов. Решение заключается в создании нескольких запросов и объединении их с помощью UNION.

www.leadersoft.ru

Создание запроса на основе нескольких таблиц

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

Выберите нужное действие

Уточнение данных в запросе с помощью данных из связанной таблицы

Объединение данных в двух таблицах с помощью их связей с третьей таблицей

Просмотр всех записей из двух похожих таблиц

Уточнение данных в запросе с помощью данных из связанной таблицы

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

Использование мастера запросов для построения запроса на основе главной и связанной таблицы

  1. Убедитесь, что для таблиц задано отношение в окно отношений.

    Инструкции

    1. На вкладке Работа с базами данных в группе Показать или скрыть выберите пункт Отношения.

    2. На вкладке Конструктор в группе Связи нажмите кнопку Все связи.

    3. Выберите таблицы, которые нужно связать.

      • Если таблицы отображаются в окне схемы данных, убедитесь, что отношение между ними уже установлено.

        Отношение отображается в виде линии, соединяющей общие поля двух таблиц. Чтобы узнать, какие поля таблиц связаны отношением, дважды щелкните линию связи.

      • Если таблицы не отображаются в окне схемы данных, следует добавить их.

        На вкладке Конструктор в группе Показать или скрыть нажмите кнопку Имена таблиц.

        Дважды щелкните каждую из таблиц, которые вы хотите отобразить, а затем нажмите кнопку Закрыть.

    4. Если между таблицами не установлено отношение, создайте его, перетащив поле из одной таблицы на поле другой. Поля, по которым создается отношение, должны иметь одинаковый тип данных.

      Примечание: Создать отношение между полем с типом Тип данных «Счетчик» и полем, имеющим тип данных Числовой тип данных, можно в том случае, если это поле имеет размер «длинное целое». Это часто бывает так при создании отношение «один-ко-многим».

      Откроется диалоговое окно Изменение связей.

    5. Нажмите кнопку Создать для создания связи.

      Дополнительные сведения о параметрах, используемых при создании отношения, см. в статье Создание, изменение и удаление отношения.

    6. Закройте окно схемы данных.

  2. На вкладке Создание в группе Запросы нажмите кнопку Мастер запросов

  3. В диалоговом окне Новый запрос выберите пункт Простой запрос и нажмите кнопку ОК.

  4. В поле со списком Таблицы и запросы выберите таблицу, содержащую основные сведения, которые вы хотите включить в запрос.

  5. В области Доступные поля щелкните первое поле, которое вы хотите включить в запрос, и нажмите кнопку с одинарной стрелкой вправо, чтобы переместить это поле в список Выбранные поля. Повторите то же самое для каждого поля этой таблицы, которое вы хотите включить в запрос. Это могут быть поля, данные из которых должны выводиться в результатах запроса, или поля, используемые для наложения ограничений на выводимые строки путем задания определенных условий.

  6. В поле со списком Таблицы и запросы выберите таблицу, содержащую дополнительные сведения, с помощью которых вы хотите уточнить результаты запроса.

  7. Добавьте поля, которые следует использовать для уточнения результатов запроса, в список Выбранные поля и нажмите кнопку Далее.

  8. В группе Выберите подробный или итоговый отчет выберите вариант Подробный или Итоговый.

    Если не требуется использовать в запросе какие-либо агрегатные функции (Sum, Avg, Min, Max, Count, StDev или Var), выберите подробный запрос. В противном случае выберите вариант «Сводка». Выбрав параметры, нажмите кнопку Далее.

  9. Нажмите кнопку Готово для просмотра результатов.

Пример на основе базы данных «Борей»

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

Примечание: Этот пример подразумевает изменение учебной базы данных «Борей». Рекомендуем сделать ее резервную копию и выполнять инструкции, используя резервную копию.

Построение запроса с помощью мастера запросов
  1. Откройте учебную базу данных «Борей». Закройте форму входа.

  2. На вкладке Создание в группе Запросы нажмите кнопку Мастер запросов

  3. В диалоговом окне Новый запрос выберите пункт Простой запрос и нажмите кнопку ОК.

  4. В поле со списком Таблицы и запросы выберите пункт Таблица: Заказы.

  5. В списке Доступные поля дважды щелкните пункт ИД_заказа, чтобы переместить это поле в список Выбранные поля. Дважды щелкните пункт Цена доставки, чтобы переместить это поле в список Выбранные поля.

  6. В поле со списком Таблицы и запросы выберите пункт Таблица: Сотрудники.

  7. В списке Доступные поля дважды щелкните пункт Имя, чтобы переместить это поле в список Выбранные поля. Дважды щелкните пункт Фамилия, чтобы переместить это поле в список Выбранные поля. Нажмите кнопку Далее.

  8. Так как вы создаете список всех заказов, следует использовать подробный запрос. Если нужно суммировать стоимость доставки заказов, выполненных сотрудником, или применить другую агрегатную функцию, следует использовать итоговый запрос. Выберите вариант Подробный (вывод каждого поля каждой записи) и нажмите кнопку Далее.

  9. Нажмите кнопку Готово для просмотра результатов.

Запрос вернет перечень заказов, для каждого из которых будет указана стоимость доставки, а также имя и фамилия сотрудника, выполнившего его.

К началу страницы

Объединение данных в двух таблицах с помощью их связей с третьей таблицей

Часто данные в двух таблицах связаны друг с другом через третью таблицу. Это может быть в том случае, когда данные в первых двух таблицах связаны отношение «многие-ко-многим». Хорошим приемом при проектировании баз данных является разбиение одной связи с отношением «многие-ко-многим» между двумя таблицами на две связи с отношением «один-ко-многим», в которых участвуют три таблицы. Это делается путем создания третьей (связующей) таблицы, в которой есть первичный ключ и внешний ключ для каждой из таблиц. Затем создается связь «один-ко-многим» между каждым внешним ключом связующей таблицы и соответствующим первичным ключом связуемой таблицы. В таких случаях следует включать в запрос все три таблицы, даже если вы хотите получить данные только из двух.

Создание запроса на выборку с использованием таблиц, связанных отношением «многие-ко-многим»

  1. На вкладке Создание в группе Запросы нажмите кнопку Конструктор запросов

    Откроется диалоговое окно Добавление таблицы.

  2. В диалоговом окне Добавление таблицы дважды щелкните две таблицы, содержащие данные, которые вы хотите включить в запрос, а также связующую их таблицу, после чего нажмите кнопку Закрыть.

    Все три таблицы появятся в рабочей области конструктора запросов, связанные по соответствующим полям.

  3. Дважды щелкните поля, которые вы хотите использовать в запросе. Каждое поле появится в бланк запроса.

  4. В бланке запроса укажите условия для полей в строке Условия отбора. Чтобы поле, по которому задаются условия, не отображалось в результатах запроса, снимите флажок в строке Показать для него.

  5. Чтобы отсортировать результаты по значениям поля, в бланке запроса в строке Сортировка для него выберите значение По возрастанию или По убыванию (в зависимости от того, в каком направлении вы хотите выполнить сортировку записей).

  6. На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить.

    Access выведет результаты запроса в режим таблицы.

Пример на основе базы данных «Борей»

Примечание: Этот пример подразумевает изменение учебной базы данных «Борей». Рекомендуем сделать ее резервную копию и выполнять инструкции, используя резервную копию.

Предположим, что у вас появилась новая возможность: поставщик из Рио-де-Жанейро нашел ваш веб-сайт и хочет с вами сотрудничать. Однако он работает только в Рио-де-Жанейро и Сан-Паулу. Компания поставляет все интересующие вас категории пищевых продуктов. Являясь довольно крупным предприятием, поставщик хочет, чтобы вы гарантировали достаточно большой рынок сбыта, который обеспечил бы ему годовые продажи объемом не менее 20 000 бразильских реалов (около 9 300 долларов США). Можете ли вы обеспечить требуемый рынок сбыта?

Данные, необходимые для ответа на этот вопрос, находятся в двух местах: в таблице «Клиенты» и в таблице «Сведения о заказе». Эти таблицы связаны друг с другом через таблицу «Заказы». Отношения между этими таблицами уже заданы. В таблице «Заказы» для каждого заказа может быть указан только один клиент, связанный с таблицей «Клиенты» по полю «ИДКлиента». Каждая запись в таблице «Сведения о заказе» связана только с одним заказом в таблице «Заказы» по полю «ИД_заказа». Таким образом, у каждого клиента может быть множество заказов, для каждого из которых есть несколько записей со сведениями.

В данном примере следует построить перекрестный запрос, в котором будут отображены годовые продажи в городах Рио-де-Жанейро и Сан-Паулу.

Открытие запроса в Конструкторе

  1. Откройте базу данных «Борей». Закройте форму входа.

  2. На вкладке Создание в группе Запросы нажмите кнопку Конструктор запросов

    Откроется диалоговое окно Добавление таблицы.

  3. В диалоговом окне Добавление таблицы дважды щелкните таблицы Клиенты, Заказы и Сведения о заказе, а затем нажмите кнопку Закрыть.

    Все три таблицы появятся в рабочей области конструктора запросов.

  4. В таблице «Клиенты» дважды щелкните поле «Город», чтобы добавить его в бланк запроса.

  5. В бланке запроса в строке Условие отбора столбца Город введите In («Рио-де-Жанейро»,»Сан Паулу). Это позволяет включить в запрос только записи о заказах клиентов из этих городов.

  6. В таблице «Сведения о заказе» дважды щелкните поля «ДатаИсполнения» и «Цена».

    Поля добавляются в бланк запроса.

  7. В столбце бланка запроса ДатаИсполнения выберите строку Поле. Замените [ДатаИсполнения] на Год: Format([ДатаИсполнения],»yyyy»). При этом будет создан псевдоним поля (Год), позволяющий использовать только значение года из даты, указанной в поле «ДатаИсполнения».

  8. В столбце бланка запроса Цена выберите строку Поле. Замените [Цена] на Продажи: [Сведения о заказе].[Цена]*[Количество]-[Сведения о заказе].[Цена]*[Количество]*[Скидка]. При этом будет создан псевдоним поля (Продажи), вычисляющий сумму продаж для каждой записи.

  9. На вкладке Конструктор в группе Тип запроса щелкните элемент Перекрестная таблица.

    В бланке запроса появятся две новые строки: Итоги и Перекрестная таблица.

  10. В столбце бланка запроса Город щелкните строку Перекрестная таблица, а затем щелкните Заголовки строк.

    Названия городов будут использоваться в качестве заголовков строк (т. е. запрос будет возвращать одну строку для каждого города).

  11. В столбце Год щелкните строку Перекрестная таблица, а затем щелкните Заголовки столбцов.

    Значения годов будут использоваться в качестве заголовков столбцов (т. е. запрос будет возвращать один столбец для каждого года).

  12. В столбце Продажи щелкните строку Перекрестная таблица, а затем щелкните элемент Значение.

    Значения продаж будут отображаться на пересечениях строк и столбцов (т. е. запрос будет возвращать одно значение продаж для каждого сочетания города и года).

  13. В столбце Продажи щелкните строку Итоги, а затем щелкните элемент Sum.

    Запрос будет суммировать все значения столбца.

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

  14. На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить.

Теперь у вас есть запрос, возвращающий общие годовые продажи по Рио-де-Жанейро и Сан-Паулу.

К началу страницы

Просмотр всех записей из двух похожих таблиц

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

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

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

Чтобы просмотреть все записи из двух таблиц с одинаковой структурой, используйте запрос на объединение.

Запросы на объединение невозможно отобразить в Конструкторе. Они создаются с помощью команд SQL, которые нужно вводить на вкладке объекта в режим SQL.

Создание запроса на объединение двух таблиц

  1. На вкладке Создание в группе Запросы нажмите кнопку Конструктор запросов

    Откроется бланк конструктора запроса и диалоговое окно Добавление таблицы.

  2. В диалоговом окне Добавление таблицы нажмите кнопку Закрыть.

  3. На вкладке Конструктор в группе Тип запроса нажмите кнопку Объединение.

    Запрос переключится из Конструктора в режим SQL. На данном этапе вкладка объекта в режиме SQL будет пуста.

  4. В режиме SQL введите SELECT и список полей первой таблицы, которые вы хотите включить в запрос. Имена полей должны быть заключены в квадратные скобки и разделены запятыми. Когда вы закончите вводить имена полей, нажмите клавишу ВВОД. Курсор переместится на одну строку вниз в окне режима SQL.

  5. Введите FROM и имя первой таблицы, включаемой в запрос. Нажмите клавишу ВВОД.

  6. Если вы хотите указать условие для поля первой таблицы, введите WHERE, имя поля, оператор сравнения (обычно знак равенства =) и условие. Можно добавлять дополнительные условия к концу предложения WHERE, используя ключевое слово AND и такой же синтаксис, как и для первого условия (например, WHERE [Уровень]=»100″ AND [Часов]>2). После завершения ввода условий нажмите клавишу ВВОД.

  7. Введите слово UNION и нажмите клавишу ВВОД.

  8. Введите SELECT и список полей второй таблицы, которые вы хотите включить в запрос. Следует указать те же поля, что для первой таблицы, и в том же порядке. Имена полей должны быть заключены в квадратные скобки и разделены запятыми. Когда вы закончите вводить имена полей, нажмите клавишу ВВОД.

  9. Введите FROM и имя второй таблицы, включаемой в запрос. Нажмите клавишу ВВОД.

  10. Если вы хотите, добавьте предложение WHERE, как описано в шаге 6.

  11. Введите точку с запятой (;), чтобы обозначить конец запроса.

  12. На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить.

    Результаты будут отображены в режиме таблицы.

К началу страницы

См. также

Объединение таблиц и запросов

support.office.com

Как связать несколько таблиц в Microsoft Access

Вся информация, которую можно получить из систем управления базами данных (СУБД), собрана в разных таблицах. Это необходимо для предотвращения переизбытка информации. Выборка и последующая работа с необходимыми сведениями осуществляется с помощью механизма связывания. Именно о том, как в Access связать таблицы и пойдет речь в этой статье. Связь происходит по общему полю, для которого следует задать определенный тип данных. Изменения можно вносить как в исходную, так и в связанную таблицу – они в любом случае будут отображаться в обеих БД.

Пошаговая инструкция

  1. Откройте БД в программе (помните, что связать можно минимум 2 таблицы в Access).
  2. Заполните поля информацией, учитывая, что для осуществления операции, поля должны иметь схожий тип данных. Если созданная связь имеет формат «один ко многим», то поля в первой таблице могут иметь тип «Счетчика», а соответствующая ячейка во второй – должна быть числовой. В качестве ключевого следует задать именно счетчик.
  3. Откройте меню «Сервис/Схема данных» после чего на экране появится область со связанными элементами. Если же она пуста, то окно добавления таблиц откроется в Access автоматически.
  4. Для того чтобы включить связываемые таблицы Access в открытую БД, следует выделять необходимые названия и кликать на кнопку «Добавить». При этом изображения с табличками будут появляться в рабочей области.
  5. Чтобы установить связи между таблицами в Access следует захватить поле одного объекта, перенести и отпустить мышку над соответствующим полем в другом. После этого на экране появится окошко с настройками.
  6. Если задать точное расположение ячеек в Access с помощью мышки не удалось, их можно настроить в выпадающих списках. Включение всех «флажков» обеспечит целостность и сохранность данных, а также их каскадное изменение.
  7. Установленный тип отношений можно просмотреть внизу окошка. Всего их три: «1 ко многим», «к одному» и «многие ко многим». Если в окне отобразился не тот параметр, значит, типы полей были заданы неверно.
  8. После нажатия на кнопку «Создать» между изображениями появится линия с цифрой 1 и символом бесконечности. Это значит, что объекты Access связаны соотношением «один ко многим».

Как видите, ничего сложного в установлении связи между таблицами в Access нет. Надеемся, что наше руководство окажется полезным для вас!

officeapplications.net

SQL-соединения и MS Access — как объединить несколько таблиц в один?

У меня есть четыре таблицы в Access 2010, каждый с одним и тем же основным ключом. Я хотел бы объединить все данные во всех четырех таблицах в одну таблицу со столбцами для каждого значения, привязанного к первичному ключу по всем таблицам. Так, например:

Table1 

ID Value1 

1 10  
2 7 
3 4 
4 12 

Table 2 

ID Value2 

1 33 
2 8 
6 19 
7 4 

Table 3 

ID Value3 

1 99 
2 99 
5 99 
7 99 

Я хотел бы создать:

Table 4 

ID Value1 Value2 Value3 

1 10  33  99 
2 7  8  99 
3 4 
4 12 
5   99 
6   19  
7   4  99 

Я использую MS Access, и я знаю, что я должен использовать в основном 3 присоединяется (левый, правый, внутренний) к получить полное соединение, но я не совсем уверен, как структурировать запрос.

Может кто-нибудь, пожалуйста, дайте мне пример кода SQL, чтобы указать мне в правильном направлении относительно того, как произвести этот результат?

Вот что у меня есть. Это объединяет все таблицы, но похоже, что я все еще не хватает данных. Я сделал что-то не так:

SELECT Coventry.cptcode, Coventry.[Fee Schedule], CT6002.[Fee Schedule], Medicare.[Fee Schedule], OFSP.[Fee Schedule] 
FROM ((Coventry LEFT JOIN CT6002 ON Coventry.cptcode = CT6002.cptcode) LEFT JOIN Medicare ON CT6002.cptcode = Medicare.cptcode) LEFT JOIN OFSP ON Medicare.cptcode = OFSP.cptcode 
UNION 
SELECT Coventry.cptcode, Coventry.[Fee Schedule], CT6002.[Fee Schedule], Medicare.[Fee Schedule], OFSP.[Fee Schedule] 
FROM ((Coventry RIGHT JOIN CT6002 ON Coventry.cptcode = CT6002.cptcode) RIGHT JOIN Medicare ON CT6002.cptcode = Medicare.cptcode) RIGHT JOIN OFSP ON Medicare.cptcode = OFSP.cptcode 
UNION 
SELECT Coventry.cptcode, Coventry.[Fee Schedule], CT6002.[Fee Schedule], Medicare.[Fee Schedule], OFSP.[Fee Schedule] 
FROM ((Coventry INNER JOIN CT6002 ON Coventry.cptcode = CT6002.cptcode) INNER JOIN Medicare ON CT6002.cptcode = Medicare.cptcode) INNER JOIN OFSP ON Medicare.cptcode = OFSP.cptcode; 

stackoverrun.com

Соединения SQL и MS Access

Вот вариант ответа JohnLBevan, который будет работать, если [Value1], [Value2] и [Value3] имеют разные типы. Например, с

Таблица 1

ID Value1
-- ------ 1 10 2 7 3 4 4 12

Таблица 2

ID Value2
-- ------------ 1 thirty-three 2 eight 6 nineteen 7 four

Таблица3

ID Value3
-- ---------- 1 1999-01-01 2 1999-01-01 5 1999-01-01 7 1999-01-01

запрос

SELECT ID, MAX(v1) AS Value1, MAX(v2) AS Value2, MAX(v3) as Value3
FROM ( SELECT 0 AS ID, 0 AS v1, '' AS v2, #2001-01-01# AS v3 FROM (SELECT COUNT(*) FROM Table1) UNION ALL SELECT ID, Value1 AS v1, NULL AS v2, NULL AS v3 FROM Table1 UNION ALL SELECT ID, NULL AS v1, Value2 AS v2, NULL AS v3 FROM Table2 UNION ALL SELECT ID, NULL AS v1, NULL AS v2, Value3 AS v3 FROM Table3
)
WHERE ID > 0
GROUP BY ID

возвращается

ID Value1 Value2 Value3
-- ------ ------------ ---------- 1 10 thirty-three 1999-01-01 2 7 eight 1999-01-01 3 4 4 12 5 1999-01-01 6 nineteen 7 four 1999-01-01

Объяснение:

Первая часть подзапроса UNION создает одну строку с фиктивными значениями, чтобы гарантировать, что результат UNIONs имеет правильные типы столбцов

SELECT 0 AS ID, 0 AS v1, '' AS v2, #2001-01-01# AS v3
FROM (SELECT COUNT(*) FROM Table1)

возвращается

ID v1 v2 v3
-- -- -- ---------- 0 0 2001-01-01

Остальная часть подзапроса UNION добавляет фактические строки из каждой таблицы

SELECT 0 AS ID, 0 AS v1, '' AS v2, #2001-01-01# AS v3 FROM (SELECT COUNT(*) FROM Table1)
UNION ALL SELECT ID, Value1 AS v1, NULL AS v2, NULL AS v3 FROM Table1
UNION ALL SELECT ID, NULL AS v1, Value2 AS v2, NULL AS v3 FROM Table2
UNION ALL SELECT ID, NULL AS v1, NULL AS v2, Value3 AS v3 FROM Table3

давая нам

ID v1 v2 v3
-- -- ------------ ---------- 0 0 2001-01-01 1 10 2 7 3 4 4 12 1 thirty-three 2 eight 6 nineteen 7 four 1 1999-01-01 2 1999-01-01 5 1999-01-01 7 1999-01-01

Запрос внешней агрегирования исключает первую строку с фиктивными значениями (идентификатор WHERE> 0), дает нам одну строку на идентификатор (GROUP BY ID) и использует функцию MAX(), чтобы вернуть значение, если оно есть (или Null if нет).

ID Value1 Value2 Value3
-- ------ ------------ ---------- 1 10 thirty-three 1999-01-01 2 7 eight 1999-01-01 3 4 4 12 5 1999-01-01 6 nineteen 7 four 1999-01-01

qa-help.ru

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *