5

我想定义一个这样的 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 * 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 的原因(除了后续的内部程序)
  • 我可以避免选择吗?
  • 我会遇到这个额外选择的问题吗?(任何性能问题?)
4

1 回答 1

7

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

于 2012-09-16T15:40:57.210 回答