2011-02-15 54 views
1

框架:Rails 2.3.8 数据库; PostgreSQL的将两个单独的SQL查询的结果与“或”组合起来使用

我现在有下面的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语句用“OR”条件,选择哪个都与细菌表所在的bacteria.name是像“VTEC 0157”或相关的爆发记录到病毒表virus.name与“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联合。

。想想的答复来看下面我将用两个单独的语句,欢呼:)

回答

5

我认为你是混淆或与SQL UNION操作加入了两个查询的回报的工会去。

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

只要将一个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%') 
+0

+1工会之间的**所有** – 2011-02-15 11:29:43

相关问题