Объединение трех таблиц с помощью запроса UNION

Я пытаюсь извлечь уникальные наборы данных из трех разных таблиц и отобразить их вместе с помощью запроса UNION. У них есть одно общее поле, поэтому они должны быть связаны через это поле. Я получаю сообщение об ошибке, когда пытаюсь выполнить запрос, в котором говорится: «Невозможно выполнить запрос. Недопустимая операция или синтаксис с использованием поля с несколькими значениями». Я знаю, какое поле вызывает проблему, это поле «Направление деятельности». Как мне исправить это, чтобы запрос мог его обработать? Это вообще возможно?

Вот оператор SQL, который я использую:

SELECT [Financial Bureau Reports].[Date Year], [Financial Bureau Reports].[Section Chief].[Financial Bureau Reports].[Outcome], [Financial Bureau Reports].[Type of Review]
FROM [Financial Bureau Reports]
WHERE (([Financial Bureau Reports].[CoCode (NAIC)]=[Forms]![Home Screen]![txtCoCode]))

UNION ALL

SELECT [Market Analysis Review].[Data Year], [Market Analysis Review].[Review Level], [Market Analysis Review].[Line of Business].[value], [Market Analysis Review].[Recommendation], [Market Analysis Review].[Analyst], [Market Analysis Review].[Action]
FROM [Market Analysis Review]
WHERE(([Market Analysis Review].[CoCode (NAIC)]=[Financial Bureau Reports].[CoCode(NAIC)]))

UNION ALL 

SELECT [MarketConductExams].[State], [MarketConductExams].[Report Date]
FROM [MarketConductExams]
WHERE [MarketConductExams].[CoCode (NAIC)]=[Market Analysis Review].[CoCode (NAIC)];

Извините за отсутствие форматирования, видимо, SQL не очень хорошо переносится.

Кроме того, я использую SQL в Microsoft Access 2010.

Дайте мне знать, если вопрос слишком расплывчатый или требует уточнения. Спасибо!


person GregSpev    schedule 30.11.2012    source источник
comment
Как минимум, вы можете выделить блок кода и нажать ctl-k или нажать кнопку { }, чтобы отформатировать его как блок кода.   -  person Michael Berkowski    schedule 30.11.2012


Ответы (4)


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

person HLGEM    schedule 30.11.2012

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

Используйте AS для синхронизации имен полей. Если у вас есть поля, которых нет в других запросах, вы можете их создать: null как SomeOutputField или '' как SomeOutputField.

person EricR    schedule 30.11.2012

Я не знаю, почему вы получаете именно это сообщение, но операторы UNION требуют, чтобы каждый оператор SELECT имел одинаковое количество столбцов и чтобы они были одного типа данных. Это не относится к оператору SQL, который вы опубликовали.

person Melanie    schedule 30.11.2012

Я думаю, вам нужно ПРИСОЕДИНЯТЬ свои таблицы друг к другу, а не ОБЪЕДИНЯТЬ их вместе - вот так:

SELECT [Financial Bureau Reports].[Date Year], 
       [Financial Bureau Reports].[Section Chief].[Financial Bureau Reports].[Outcome], 
       [Financial Bureau Reports].[Type of Review],
       [Market Analysis Review].[Data Year], 
       [Market Analysis Review].[Review Level], 
       [Market Analysis Review].[Line of Business].[value], 
       [Market Analysis Review].[Recommendation], 
       [Market Analysis Review].[Analyst], 
       [Market Analysis Review].[Action],
       [MarketConductExams].[State], 
       [MarketConductExams].[Report Date]
FROM [Financial Bureau Reports]
(JOIN [Market Analysis Review]
   ON [Market Analysis Review].[CoCode (NAIC)]=[Financial Bureau Reports].[CoCode(NAIC)]
 (JOIN [MarketConductExams]
    ON [MarketConductExams].[CoCode (NAIC)]=[Market Analysis Review].[CoCode (NAIC)]))
WHERE [Financial Bureau Reports].[CoCode (NAIC)]=[Forms]![Home Screen]![txtCoCode];
person Community    schedule 30.11.2012
comment
Имеет смысл. Я попробовал, и я получаю сообщение об ошибке, говорящее о синтаксической проблеме в поле FROM... есть идеи? - person GregSpev; 30.11.2012
comment
Можете ли вы включить фактическое сообщение об ошибке? FROM — это начало предложения, а не имя поля; если сообщение об ошибке относится к полю FROM, проверьте, есть ли в вашем коде запятая после [MarketConductExams].[Report Date]. Вы также можете попробовать удалить ((...)) из первых условий ON и WHERE или добавить их во второе условие ON. - person ; 30.11.2012
comment
Первоначально я получал сообщение о синтаксической ошибке в предложении FROM. Теперь, после добавления запятой после [MarketConductExams].[Report Date], я получаю сообщение об ошибке: Оператор SELECT включает зарезервированное слово или имя аргумента, которое написано с ошибкой или отсутствует, или неправильная пунктуация. (Я также прошел и отрегулировал брекетинг). - person GregSpev; 30.11.2012
comment
@GregSpev: Вы неправильно поняли мой предыдущий комментарий - после [MarketConductExams].[Дата отчета] не должно быть запятой. Я пытался предоставить возможные решения в отсутствие фактического сообщения об ошибке (что всегда является плохой идеей). Я читал в другом месте, что объединенные таблицы в Access должны быть заключены в круглые скобки, и соответствующим образом изменил свой запрос. Можете ли вы попробовать обновленный запрос? - person ; 01.12.2012
comment
Ах, попался. Виноват. Хорошо, я попробовал предложенный вами запрос, и я все еще получаю синтаксическую ошибку в предложении FROM. Это произошло со скобками, заключающими предложение JOIN, и все равно ошибка. - person GregSpev; 01.12.2012
comment
@GregSpev: попробуйте изменить JOIN на INNER JOIN — в большинстве диалектов SQL INNER является необязательным, но похоже, что он может быть обязательным в Access: msdn.microsoft.com/en-us/library/office/ . Если это все еще не работает, то это вне меня. - person ; 01.12.2012