簡體   English   中英

Esqueleto:加入子查詢(使用 subList_select)

[英]Esqueleto: join on subquery (using subList_select)

我正在嘗試將以下 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)

可能需要在on子句中添加/刪除just 我發現我在那里需要的東西非常不直觀。

還要小心你使用max_ (esqueleto)而不是max (標准庫),否則你會遇到其他令人困惑的錯誤!

我想我可以使用在語義上應該相同的以下內容(受此答案啟發):

$ select
$ from $ \( s `LeftOuterJoin` ms ) -> do
        on ( just (s ^. ScenarioAuthorId)  ==. ms ?. ScenarioAuthorId &&.
             just (s ^. ScenarioTaskId)    ==. ms ?. ScenarioTaskId   &&.
             just (s ^. ScenarioLastUpdate) <. ms ?. ScenarioLastUpdate )
  where_ (isNothing (ms ?. ScenarioId))

仍然讓我感到困惑的是,Esqueleto 顯然只支持與in_ ... 結合使用的具有多個結果的子查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM