使用UNION和Sequel

knu*_*nut 4 ruby sql union sequel

我想定义一个像这样的SQL命令:

SELECT * FROM WOMAN
UNION
SELECT * FROM MEN
Run Code Online (Sandbox Code Playgroud)

我尝试使用Ruby + Sequel中的以下代码序列来定义它:

require 'sequel'

DB = Sequel::Database.new()
sel = DB[:women].union(DB[:men])
puts sel.sql
Run Code Online (Sandbox Code Playgroud)

结果是(我在结果上做了一些漂亮的打印):

SELECT * FROM (
    SELECT * FROM `women` 
    UNION 
    SELECT * FROM `men`
) AS 't1'
Run Code Online (Sandbox Code Playgroud)

还有一个(多余的?)SELECT.

如果我UNION在此代码示例中定义了多个

sel = DB[:women].union(DB[:men]).union(DB[:girls]).union(DB[:boys])
puts sel.sql
Run Code Online (Sandbox Code Playgroud)

我得到了更多多余的SELECT.

SELECT * FROM (
  SELECT * FROM (
    SELECT * FROM (
      SELECT * FROM `women` 
      UNION 
      SELECT * FROM `men`
    ) AS 't1' 
    UNION 
    SELECT * FROM `girls`
  ) AS 't1' 
  UNION
  SELECT * FROM `boys`
) AS 't1'
Run Code Online (Sandbox Code Playgroud)

到目前为止我没有发现任何问题,结果似乎是一样的.

我的问题:

  • 是否有其他selects 的原因(旁边续集内部程序)
  • 我可以避免选择吗?
  • 我可以通过这些额外选择遇到问题吗?(任何性能问题?)

Jer*_*ans 6

额外SELECT的原因是代码DB[:girls].union(DB[:boys]).where(:some_column=>1)运行正常.您可以使用DB[:girls].union(DB[:boys], :from_self=>false)不将其包装在额外的SELECT中,如文档中所述.