Объединение результатов двух отдельных SQL-запросов с 'ИЛИ' - PullRequest
1 голос
/ 15 февраля 2011

Каркас: Рельсы 2.3.8 База данных; PostgreSQL

В настоящее время у меня есть следующие операторы SQL (сгенерированные Rails)

SELECT "outbreaks".* FROM "outbreaks" INNER JOIN "bacterial_agents" ON bacterial_agents.outbreak_id = outbreaks.id INNER JOIN "bacteria" ON "bacteria".id = "bacterial_agents".bacterium_id WHERE (bacteria.name ILIKE E'%VTEC O157%')

SELECT "outbreaks".* FROM "outbreaks" INNER JOIN "viral_agents" ON viral_agents.outbreak_id = outbreaks.id INNER JOIN "virus" ON "virus".id = "viral_agents".virus_id WHERE (virus.name ILIKE E'%NOROVIRUS%')

Со следующими таблицами (я пропустил неиспользуемые атрибуты, а наименование макета / ключа соответствует соглашениям Rails)

outbreaks
  id

bacterial_agents
  id
  outbreak_id
  bacterium_id

bacteria
  id
  name

viral_agents
  id
  outbreak_id
  virus_id

viruses
  id
  name

Любые идеи о том, как бы объединить два приведенных выше оператора SQL с условием «ИЛИ», чтобы выбрать записи о вспышках, которые связаны с таблицей бактерий, в которой значение bacet.name равно «VTEC O157» ИЛИ, связанное с таблицей вирусов, где имя вируса похоже на "Норовирус"?

* EDIT

Отсутствие пояснений по поводу генерации SQL Rails - в настоящее время выводится следующий SQL

SELECT "outbreaks".* FROM "outbreaks" INNER JOIN "bacterial_agents" ON bacterial_agents.outbreak_id = outbreaks.id INNER JOIN "bacteria" ON "bacteria".id = "bacterial_agents".bacterium_id INNER JOIN "viral_agents" ON outbreaks.id = viral_agents.outbreak_id INNER JOIN "viruses" ON "viral_agents".virus_id = "viruses".id WHERE ((bacteria.name ILIKE E'%VTEC O157%') AND (viruses.name ILIKE E'%NOROVIRUS%')) LIMIT 1

По сути, я хочу вывести объединенные результаты из первых двух операторов в формат, аналогичный приведенному выше (с условием «ИЛИ» вместо «И»). Однако, если это невозможно, мне просто нужно написать область действия для обработки объединения SQL.

Подумайте, судя по ответам ниже, я пойду с объединением двух отдельных утверждений, ура:)

Ответы [ 2 ]

5 голосов
/ 15 февраля 2011

Я думаю, что вы путаете ИЛИ с оператором объединения SQL , чтобы объединить результаты двух запросов.

ИЛИ используется для управления условиями в части WHERE инструкции, а объединение используется для добавления одного запроса к другому.

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

Попробуйте это:

SELECT "outbreaks".* FROM "outbreaks" INNER JOIN "bacterial_agents" ON bacterial_agents.outbreak_id = outbreaks.id INNER JOIN "bacteria" ON "bacteria".id = "bacterial_agents".bacterium_id WHERE (bacteria.name ILIKE E'%VTEC O157%')
UNION
SELECT "outbreaks".* FROM "outbreaks" INNER JOIN "viral_agents" ON viral_agents.outbreak_id = outbreaks.id INNER JOIN "virus" ON "virus".id = "viral_agents".virus_id WHERE (virus.name ILIKE E'%NOROVIRUS%')
2 голосов
/ 15 февраля 2011

Просто поместите UNION ALL между запросами

SELECT "outbreaks".* 
  FROM "outbreaks"
  INNER JOIN "bacterial_agents"     ON bacterial_agents.outbreak_id = outbreaks.id 
  INNER JOIN "bacteria"         ON "bacteria".id = "bacterial_agents".bacterium_id
WHERE (bacteria.name ILIKE E'%VTEC O157%')

UNION ALL

SELECT "outbreaks".*
   FROM "outbreaks"
   INNER JOIN "viral_agents"    ON viral_agents.outbreak_id = outbreaks.id 
   INNER JOIN "virus"       ON "virus".id = "viral_agents".virus_id
 WHERE (virus.name ILIKE E'%NOROVIRUS%')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...