gpt4 book ai didi

sql - Esqueleto:加入子查询(使用 subList_select)

转载 作者:行者123 更新时间:2023-12-03 17:44:12 26 4
gpt4 key购买 nike

我正在尝试将以下 SQL 转换为 Esqueleto:

SELECT id, task_id, author_id
FROM scenario
INNER JOIN ( SELECT task_id as tId, author_id as aId, MAX(last_update) as lastUp
FROM scenario
GROUP BY task_id, author_id
) t
ON task_id = tId AND author_id = aId AND last_update = lastUp

要进行子查询,您必须使用 subList_select .

我想不出一种将它与模式匹配相结合的方法:
from $ \(s `InnerJoin` ?subQueryhere?) -> do ...

所以我尝试了 where_反而:
where_ (s ^. ScenarioTaskId ==. (subList_select $
from $ \s' -> do
groupBy (s' ^. ScenarioTaskId, s' ^. ScenarioAuthorId)
return s'
) ^. ScenarioTaskId)

但是,自从 subList_select 之后,它就无法编译。返回 expr (ValueList a)而不是 expr (Entity Scenario) .

最佳答案

我正在为类似的事情而苦苦挣扎。
您可以使用库的“实验”模块(位于 https://hackage.haskell.org/package/esqueleto-3.4.2.2/docs/Database-Esqueleto-Experimental.html 的文档),它比普通的 esqueleto 更强大(并且略有不同)。
主要区别在于 from - 你明确地告诉它你正在加入什么,并且有很多选择。您还需要打开一个额外的扩展程序才能使用 @TableName当你想谈论表格时的标签。
我很想把所有东西都改写成实验性的,除了它产生的错误更难解决,因为你最终会使用更多的 do 表示法。
无论如何,这是您可能需要的近似值:

    (scenario :& (taskId, authorId) <- 
from $ Table @Scenario `InnerJoin` SubQuery (do
scenario <- from $ Table @Scenario
groupBy (scenario ^. ScenarioTaskId, scenario ^. ScenarioAuthorId)
return (scenario ^. ScenarioTaskId, scenario ^. ScenarioAuthorId, max_(scenario ^. ScenarioLastUpdate))
)
`on` (\(scenario :& (taskId, authorId)) ->
(just (scenario ^. ScenarioTaskId) ==. just taskId) &&.
(just (scenario ^. ScenarioAuthorId) ==. authorId) &&.
(just (scenario ^. ScenarioLastUpdate) ==. lastUp)
)
return (scenario ^. ScenarioId, taskId, authorId)
just 的一些添加/删除s 在 on条款可能是必要的!我发现我需要的东西非常不直观。
还要小心你使用 max_ (esqueleto) 而不是 max (标准库)否则你会有其他令人困惑的错误!

关于sql - Esqueleto:加入子查询(使用 subList_select),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45057213/

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