1
我最近開始評估Squeryl ORM,它看起來不錯,但最後我來到了一個SQL查詢,這似乎是用Squeryl「構建」的問題。在Squeryl ORM中的WHERE子查詢中使用gt,gte等
我想獲得所有產品的數量都高於所有產品的平均數量。 在SQL中,這看起來像
SELECT * FROM product p WHERE p.quantity > (SELECT AVG(quantity) FROM product)
我已經發現了Squeryl支持in()
,在where
-clause子查詢exists()
和notExists()
。但由於Squeryl還支持avg
聚集,我希望這樣的事情是可能的:
val avgQuantity = from(products)(p => compute(avg(p.quantity)))
val oftenOccuringProducts = from(products)(p => where(p.quantity gt avgQuantity) select(p))
可悲的是,這引起了:
type mismatch; found : org.squeryl.Query[org.squeryl.dsl.Measures[Option[org.squeryl.PrimitiveTypeMode.FloatType]]]
required: org.squeryl.dsl.NumericalExpression[?]
當然,我能夠做的是,在2查詢(首先,獲取平均數量,然後在第二個查詢中使用它),但我想知道是否可以使用來完成一個查詢,其中包括子查詢。
Squeryl這是不可能的,還是我只是失去了一些東西?
如果可能或不可以,我會很感激任何幫助,如果,如何。
感謝,
塞巴斯蒂安
請問您可以發佈一個簡短的片段,看看sebastian_oe給出的查詢是怎麼樣的? –
嗨,我剛剛嘗試從項目的主分支修復,它的工作如期: 'val avgQuantity:org.squeryl.Query [org.squeryl.dsl.Measures [Option [Double]]] = from(products )(p => compute(avg(p.quantity)))'然後您可以在 中使用'val oftenOccuringProducts = from(products)(p => where(p.quantity gt avgQuantity)select(p))''。 正如預期的那樣,這會將查詢創建爲1個SQL語句。 (請注意,我將這個類型顯式添加到第1條語句中以使其更加清晰。) –