gpt4 book ai didi

mysql - 将 monad 组合翻译成 SQL

转载 作者:可可西里 更新时间:2023-11-01 07:39:11 25 4
gpt4 key购买 nike

我正在 Scala ( http://github.com/getquill/quill ) 中开发一个语言集成查询库,并且有一种类型的 monad 组合我正在努力为其生成对应的 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 中的应用连接来表达单子(monad)组合中的这种数据依赖性?

我正在寻找一个通用的解决方案,以便它可以用于其他组合,例如:

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 的方言。

最佳答案

一旦您需要过滤内部集合,就需要根据外部集合的存在将连接下推。可能是这样的:

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
)

关于mysql - 将 monad 组合翻译成 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32508342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com