簡體   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