Sql Esqueleto:如何使用连接删除项目
使用esqueleto是否可以执行以下查询Sql Esqueleto:如何使用连接删除项目,sql,haskell,esqueleto,Sql,Haskell,Esqueleto,使用esqueleto是否可以执行以下查询 DELETE Table1 FROM Table1 INNER JOIN Table2 ON Table1.ID = Table2.ItemID 我试过: delete $ from $ \(table1 `InnerJoin` table2) -> on (table1 ^. Table1ID ==. table2 ^. Table2ItemID) 奇怪的是,这是我在Haskell中见过的唯一一个运行时错误 ERROR:
DELETE Table1
FROM Table1
INNER JOIN Table2 ON Table1.ID = Table2.ItemID
我试过:
delete $
from $ \(table1 `InnerJoin` table2) ->
on (table1 ^. Table1ID ==. table2 ^. Table2ItemID)
奇怪的是,这是我在Haskell中见过的唯一一个运行时错误
ERROR: syntax error at or near "INNER"
LINE 2: FROM "table1" INNER JOIN "table2" ON "tab...
(基本上,DELETE
缺少“表1”是令人不快的)
我还尝试向monad添加一个返回值,这与select一样,可能会添加缺少的值。但这失败了,因为delete需要类型为m()
的monad
是否可能Esqueleto中缺少此项?在MS SQL中,您可以使用以下方式使用join删除表
DELETE Table1,Table2 FROM Table1 INNER JOIN Table2
WHERE Table1.Id1= Table2.Id1 and Table1.Id1= '1'
试试这个
delete $
from $ \(table1 `InnerJoin` table2) -> do
on (just (table1 ^. Table1ID ==. table2 ^. Table2ItemID)
我认为现在回答这个问题已经很晚了,但你可以使用EXISTS
DELETE Table1
WHERE EXISTS (SELECT * FROM Table2 WHERE Table1.ID = Table2.ItemID)
我不是SQL专家,但是
DELETE FROM table1 internal JOIN table2
看起来不是有效的SQL语句,或者至少不是标准的SQL语句。例如,PostgreSQL不支持它,手册建议使用子查询来实现这一点@chi这是正确的,但是从表1中删除表1内部联接表2
(注意额外的表1
)应该可以工作。我的问题是Esqueleto没有给我添加额外表1
的方法。由于无法添加这个额外的参数,我尝试不添加,认为它可能会以某种方式被添加,但它只是在编译时接受这个错误的语法,这会导致运行时错误。从我链接的文档中,PostgreSQL不支持DELETE
和From
之间的任何内容。在这里,我同意Esqueleto应该表现得更好。@chi我做了一些进一步的研究,你是对的,这似乎是某些DBs(ie-MySQL)支持的扩展,但不在标准中,特别是在Postgresql中。我不确定Esqueleto在支持扩展方面的理念,但事实证明,我实际上使用的是Postgresql(不确定您是如何知道的:),所以这并不重要。既然这个问题对我来说就到此为止了,请随意将您的评论升级为soln,我相信您……我认为您没有抓住问题的重点。。。。问题是,如何将此SQL查询转换为Esqueleto。这似乎是不可能的哦对不起。。。I’我对埃斯奎莱托不熟悉。我是个男人