2016-04-13 1 views
0

Я хочу построить SQL по этому вопросу, но не пытаюсь использовать sqlu.Функция Slick для SQL существует

select el.oid, el.name, el.res_cat from el 
    left join bk on (el.cat = bk.cat and bk.oid=100) 
where not exists (select 1 from dates bd where 
    el.oid=bd.lots_oid and bd.bk_oid = bk.oid) and el.e_oid=bk.e_oid 

Существуют Гладкие функции для SQL exists или not exists? Благодаря

Update 1

я понял свои ошибки, когда я снова повторно мой Slick код. Я хочу извиниться за ложную тревогу, которую я установил. Это не ответ, и, надеюсь, кто-то может помочь мне исправить мои ошибки. На данный момент я использую простой SQL Slick для продолжения моей работы.

Неверный запрос, который я построил, не работает. Это было близко к SQL, который я хотел. То, что я сделал,

val elQuery = elTable.joinLeft(bkTable) 
    .on((el, bk) => el.cat === bk.cat && bk.oid === 100) 

val query = for { 
    a <- elQuery if bdTable.filterNot(bd => a._2.map(_.oid === bd.bkOid).isDefined && a._1.oid === bd.elOid).exists 
} yield a 

finalQuery.result.statements.foreach(x => Logger.debug(s"xx => $x")) 

filterNot Я заметил, не генерирует SQL not exists. Это другая часть, которая потеряла меня.

+0

Было бы неплохо увидеть некоторые данные образца в вашем вопросе. –

+1

Что вы пробовали? Что заставляет вас думать, что Слик не поддерживает их? И http://stackoverflow.com/questions/18864351/scalatra-slick-and-insert-if-not-exists и https://groups.google.com/forum/#!topic/scalaquery/Ai8gzwMsKeg –

+0

есть inSet оператора в Slick. не уверен, что это то, чего вы хотите, но – pedrorijo91

ответ

0

У меня недостаточно репутации, чтобы оставить комментарий. Но я предполагаю, что вы хотите получить все строки, которые не выходят из таблицы дат. Я хотел бы переписать запрос, как показано ниже:

SELECT 
    el.oid, el.name, el.res_cat.cat 
FROM 
    el 
    LEFT JOIN bk ON bk.cat = el.cat 
     AND bk.e_oid = el.e_oid 
     AND bk.oid = 100 
    LEFT JOIN dates bd ON bd.lots_oid = el.oid 
     AND bd.bk_oid = bk.oid 
WHERE 
    bd.lots_oid IS NULL 

Объяснение: Вместо того, чтобы NOT EXISTS, вы можете достичь того же результата LEFT JOIN dates и указать на WHERE условии, что первичный ключ (PK) для дат IS NULL. Я не знаю PK для таблицы дат, поэтому я просто добавляю колонку, которую знаю. Вы должны приспособить его к таблице таблиц PK.

LEFT JOIN Ввод и WHERE PK IS NULL гарантирует, что строка не существует в левой объединенной таблице.

+0

Это фактически не отвечает на вопрос, хотя это может помочь OP получить нужные им данные. Это вопрос о Slick, а не о том, как переписать запрос. –

+0

Верно, это не то, что я хочу, но я в порядке, если он решает мою проблему, не используя 'SQL exists'. Проблема возникает из-за того, что я убежден, что 'SQL exists' решит мою проблему. Я мог ошибаться. Btw, 'bk.e_oid = el.e_oid' внутри левого соединения не дает правильного результата. Я думаю, что это должно быть выведено из левого соединения. Я еще попробовать их. – thlim