4

すべてを選択するための次のクエリテンプレートがあります。

val q = for {
  a <- Parameters[Int]
  b <- Parameters[Int]
  t <- T if t.a == a && t.b == b
  _ <- Query.orderBy(t.c, t.d)
} yield t

条件に一致するレコードの最初のレコード(これの最小値cd最小値c)または最後のレコード(これの最大値cと最大値)を選択するように変更する必要があります。何十万ものレコードがあるので、私は通常、(最後/最初以外の)レコードを選択しないことを強く望んでいます...dcwhere

4

2 に答える 2

3

firstOptionInvokerトレイトで定義されたメソッドがあり、いくつかの魔法によって、Queryクラスで使用できます。だから多分あなたはこのようにそれを試すことができます:

val q = for {
  a <- Parameters[Int]
  b <- Parameters[Int]
  t <- T if t.a == a && t.b == b
  _ <- Query.orderBy(t.c, t.d)
} yield t
q.firstOption
于 2012-04-16T04:52:55.090 に答える
3

OPのクエリが現在どのように構築されているかには、潜在的な危険があります。そのまま実行すると、100Kの結果セットの最初または最後の結果を取得するのはそれほど効率的ではありません(可能性は低いですが、重要なのは、クエリによって返される行数に制限がないことです)。

ストレートSQLを使用すると、そのようなことは決して行われません。代わりに、LIMIT 1

ScalaQueryでは、LIMIT = take(n)なので、クエリ自体から返される単一のレコードtake(1)を取得するために追加します

val q = (for {
  a <- Parameters[Int]
  b <- Parameters[Int]
  t <- T if t.a == a && t.b == b
  _ <- Query.orderBy(t.c, t.d)
} yield t) take(1)
q.firstOption
于 2012-04-16T12:24:55.873 に答える