2012-09-15 43 views
3

我要定义一个SQL命令是这样的:使用UNION与续集

SELECT * FROM WOMAN 
UNION 
SELECT * FROM MEN 

我试图与红宝石+续集以下代码序列定义该:

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

如果我这样定义的代码示例

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

在多个UNION我得到更多的多余进行选择。

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有原因的(续集内部程序旁)
  • 我可以避开选择?
  • 我可以得到这个额外选择的问题吗? (任何性能问题?)

回答

5

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

+1

谢谢。我总是感到惊讶,续集有多好 - 我总是从文档中错过它(我确信我看过联盟文档)。 – knut