2016-04-13 23 views
0

Bunun için bir SQL oluşturmak istiyorum ama sqlu kullanmamaya çalışıyorum. SQL için Slick işlevi var

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 veya not exists orada Kaygan fonksiyonlar mı? Ben yine benim Kaygan kod revisited sayesinde

Güncelleme 1

ben hatalar gerçekleşmiştir. Belirlediğim yanlış alarmdan dolayı özür dilemek istiyorum. Bu bir cevap değil ve umarım birisi hatalarımı düzeltmeme yardımcı olabilir. Şu an işime devam etmek için Slick'in sade SQL'i kullanıyorum.

Oluşturduğum Slick sorgusu çalışmadı. İstediğim SQL'e yakındı. Benim yaptığım

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")) 

Ben filterNot bir SQL not exists oluşturmaz fark oldu. Bu beni kaybeden diğer bölüm.

+0

Sorunuzdaki bazı örnek verileri görmek güzel olurdu. –

+1

Ne denediniz? Slick'in onları desteklemediğini düşünmene sebep olan nedir? Ve http://stackoverflow.com/questions/18864351/scalatra-slick-and-insert-if-not-exists ve https://groups.google.com/forum/#!topic/scalaquery/Ai8gzwMsKeg –

+0

bir inSet var Slick operatör. – pedrorijo91

cevap

0

Henüz yorum yapmak için yeterli bir itibara sahip değilim. Ancak, tarih tablosunda çıkmayan tüm satırları almak istediğinizi varsayalım. Aşağıda gibi sorgu yeniden olacaktır:

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 

Açıklama: yerine NOT EXISTS alma, sen LEFT JOIN dates aynı şeyi elde edebilirsiniz ve WHERE şartla belirttiğiniz tarihler IS NULL için birincil anahtar (BA). Tarihleri ​​için PK'yi bilmiyorum, bu yüzden tanıdığım sütunu ekliyorum. Bunu tarihler tablosunun PK'sine ayarlamanız gerekir.

LEFT JOIN ing ve WHERE PK IS NULL, satırın birleşik soldaki tabloda bulunmadığını garanti eder.

+0

Bu aslında soruyu cevaplamıyor, ancak OP'nin istediği verileri almasına yardımcı olabilir. Bir sorguyu yeniden yazmayla ilgili değil, Slick hakkında bir soru. –

+0

Doğru, istediğim şey değil, 'SQL exists' kullanmadan sorunumu çözerse iyi olurum. Sorun ortaya çıkıyor çünkü 'SQL'in varlığımın problemimi çözeceğine inanıyorum. Yine de yanlış olabilirim. Btw, sol birleştirmenin içinde 'bk.e_oid = el.e_oid' doğru sonucu üretmiyor. Sanırım sol birleşimden çıkarılmalı. Onları denemem. – thlim