使用UNION和Sequel

时间:2012-09-15 14:33:48

标签: sql ruby union sequel

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

SELECT * FROM WOMAN
UNION
SELECT * FROM MEN

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

require 'sequel'

DB = Sequel::Database.new()
sel = DB[:women].union(DB[:men])
puts sel.sql

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

SELECT * FROM (
    SELECT * FROM `women` 
    UNION 
    SELECT * FROM `men`
) AS 't1'

还有一个(多余的?)SELECT

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

sel = DB[:women].union(DB[:men]).union(DB[:girls]).union(DB[:boys])
puts sel.sql

我得到了更多多余的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'

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

我的问题:

  • 是否有理由增加select s(旁边续集内部程序)
  • 我可以避免选择吗?
  • 我可以通过这些额外选择遇到问题吗? (任何性能问题?)

1 个答案:

答案 0 :(得分:6)

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