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を取得します。

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(続編の内部手順のほかに)
  • 選択を回避できますか?
  • この追加の選択で問題が発生する可能性はありますか?(パフォーマンスの問題はありますか?)
4

1 に答える 1

7

追加のSELECTの理由は、コードのようにDB[:girls].union(DB[:boys]).where(:some_column=>1)正しく動作するためです。ドキュメントDB[:girls].union(DB[:boys], :from_self=>false)に記載されているように、追加のSELECTでラップしないように使用できます。

于 2012-09-16T15:40:57.210 に答える