2015-09-29 4 views
8

Можно ли использовать следующий запрос с помощью 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: syntax error at or near "INNER" 
LINE 2: FROM "table1" INNER JOIN "table2" ON "tab... 

(в основном, это было что DELETE не был в поле "table1")

Я также попытался добавить возвращаемое значение к моне d, который, как и в случае с select, может добавить это отсутствующее значение. Но это терпит неудачу, потому что для удаления требуется монада типа m().

Возможно ли, что это просто отсутствует в Esqueleto?

+0

Я не эксперт по SQL, но 'DELETE FROM table1 INNER JOIN table2' не выглядит как допустимый оператор SQL или, по крайней мере, не является стандартным. Например, PostgreSQL не поддерживает его, и в руководстве предлагается подзапрос для его выполнения. http://www.postgresql.org/docs/9.4/static/sql-delete.html – chi

+0

@chi Это правильно, но '' 'DELETE table1 из таблицы1 INNER JOIN table2''' (обратите внимание на дополнительную таблицу1) должно сработать. Моя проблема в том, что Esqueleto не дает мне способ добавить дополнительную '' 'table1'''. Поскольку нет возможности добавить этот дополнительный параметр, я пробовал без него, думая, что его можно каким-то образом добавить, но он просто принимает этот ошибочный синтаксис в compiletime, что затем приводит к ошибке выполнения. – jamshidh

+0

Из документов, с которыми я связан, PostgreSQL не поддерживает ничего между 'DELETE' и' FROM'. Я согласен с тем, что Эскелету должен вести себя лучше, здесь. – chi

ответ

-3

В MS SQL вы можете использовать его можно удалить с помощью таблицы присоединиться следующим образом

DELETE Table1,Table2 FROM Table1 INNER JOIN Table2 
WHERE Table1.Id1= Table2.Id1 and Table1.Id1= '1' 
+0

Я думаю, что вам не хватает точки вопроса .... Вопрос в том, как я конвертирую этот SQL-запрос в Esqueleto. Это кажется невозможным. – jamshidh

+0

Ой, извините ... м не знаком с Эскелетто. , m sql парень –

0

Попробуйте это.

delete $ 
from $ \(table1 `InnerJoin` table2) -> do 
on (just (table1 ^. Table1ID ==. table2 ^. Table2ItemID)