繁体   English   中英

将两个单独的SQL查询的结果与“ OR”组合

[英]Combining the results of two seperate SQL queries with 'OR'

框架:Rails 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

任何想法,我如何将上面两个带有“ OR”条件的SQL语句结合起来,以选择与细菌表相关的爆发记录,其中细菌.name如“ VTEC O157”,或与病毒表相关的病毒。名称像“ NOROVIRUS”?

*编辑

关于Rails生成SQL的一些说明-当前输出以下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

本质上,我想将前两个语句的组合结果输出为与上述语句类似的格式(用“ OR”条件代替“ AND”)。 但是,如果这不可能,我只需要编写一个作用域来处理SQL联合。

想想从下面的答复来看,我将结合两个单独的声明,加油:)

我认为您将SQL联合运算符与OR混淆,无法将两个查询的返回值结合在一起。

OR用于管理语句的WHERE部分中的条件,而union用于将一个查询附加到另一个查询。

您应该注意,仅当两个查询具有相同的域时,联合才有效。 通过快速查看您的查询,它应该完全符合您的想法。

尝试这个:

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%')

只需在查询之间放置一个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%')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM