【问题标题】:Translating monad composition to SQL将 monad 组合翻译成 SQL
【发布时间】:2015-12-07 02:55:52
【问题描述】:

我正在使用 Scala (http://github.com/getquill/quill) 开发一个语言集成查询库,我正在努力为其生成对应的 SQL 查询。

可以针对这些情况生成查询:

t1.flatMap(a => t2.filter(b => b.s == a.s).map(b => b.s))

   SELECT t2.s FROM t1, t2 WHERE t2.s = t1.s

t1.flatMap(a => t2.map(b => b.s).take(10))

   SELECT x.s FROM t1, (SELECT * FROM t2 LIMIT 10) x

但我不知道如何表达另一个:

t1.flatMap(a => t2.filter(b => b.s == a.s).map(b => b.s).take(10))

有可能吗?这个问题也可以表述为:有没有办法在 SQL 中使用应用连接来表达单子组合中的这种数据依赖关系?

我正在寻找一个通用的解决方案,这样它就可以用于像这些这样的其他作品:

t1.flatMap(a => t2.filter(b => b.s == a.s).sortBy(b => b.s % a.s).map(b => b.s).take(10))
t1.flatMap(a => t2.filter(b => b.s == a.s).map(b => b.s).take(10).flatMap(b => t3.filter(c => c.s == b.s/a.s))

我正在研究 MySQL、Postgres 和 H2 的方言。

【问题讨论】:

标签: mysql sql postgresql scala h2


【解决方案1】:

一旦你需要过滤内部集合,你需要通过外部的存在来推动连接。可能是这样的:

SELECT *
FROM t1, (
  SELECT t2.s
  FROM t2, t1 AS t1_inner
  WHERE t1_inner.s = t2.s
  LIMIT 10
)

或者,或者:

SELECT *
FROM t1, (
  SELECT t2.s
  FROM t2
  WHERE EXISTS (SELECT * FROM t1 t1_inner WHERE t1_inner.s = t2.s)
  LIMIT 10
)

【讨论】:

  • 感谢您的回答。我刚刚在问题中添加了更多信息。我正在寻找一种通用的解决方案,该解决方案足够灵活以适用于类似的作品。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-12
  • 2019-05-09
  • 2014-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多