2015-01-24 10 views
7

kullanarak katılmak yazılamıyor. TEACHERS tablo null SCHOOL_ID sütunu vardır (bir öğretmen veya bir okula ait olabilir veya) ve SCHOOLS tablo null DISTRICT_ID sütunu (bir okul veya bir bölgeye ait olabilir veya) sahiptir. Esqueleto kullanmaçift sol Ben öğretmenler, okullar ve ilçeleri ile bir veri tabanı şeması var esqueleto

, ben öğretmen listesini istiyorum, bir okul (onlar birine ait ise) ve bir bölge (bir bölgeye ait bir okula ait ise) ile her. Okul katılmak sol> sadece öğretmen için doğru ifadeyi anlamaya biraz zaman aldı, ama sonunda doğru var: Ben tekrar sola ekleyerek çalıştı

select $ 
from $ \(teacher `LeftOuterJoin` school) -> do 
    on (teacher ^. TeacherSchoolId ==. school ?. SchoolId) 
    return (teacher, school) 

benzer bir ifade kullanarak DISTRICTS üzerinden birleştirmek:

select $ 
from $ \(teacher `LeftOuterJoin` school `LeftOuterJoin` district) -> do 
    on (school ^. SchoolDistrictId ==. district ?. DistrictId) 
    on (teacher ^. TeacherSchoolId ==. school ?. SchoolId) 
    return (teacher, school, district) 

Ama bir hata alıyorum:

Couldn't match type ‘Entity School’ with ‘Maybe (Entity School)’ 
Expected type: SqlExpr (Maybe (Entity School)) 
    Actual type: SqlExpr (Entity School) 
In the first argument of ‘(?.)’, namely ‘school’ 
In the second argument of ‘(==.)’, namely ‘school ?. SchoolId’ 

bu çifte esqueleto kullanılarak

ifade edilecek katılabilir? Öyleyse nasıl?

+0

Bu kitaplığı bilmiyorum ve her şey karmaşık görünüyor, ancak bazı şeyleri SQL ile eşleştirmek için bazı 'Belki' öğelerini kaldırmanız gerekiyor gibi görünüyor. Ya da başka bir şekilde 'yuvarlak. Bilmiyorum. – dfeuer

cevap

1

deneyin değişen

on (teacher ^. TeacherSchoolId ==. school ?. SchoolId) 

o çalıştığını kadar sorgu ifadesinin diğer bileşenler üzerinde 'sadece', tokat çalışmazsa

on (teacher ^. TeacherSchoolId ==. just (school ?. SchoolId)) 

belirleyin.

Referans: Ticari bir proje

Güncelleme son zamanlarda esqueleto kullanılan 2016/10/26:

Son zamanlarda bu sorunla karşılaştı. Bunun null sonuç üretmez katılmak taklit esqueleto istekli ile etkileşim bir Kalıcı seri sorun olduğunu düşünüyorum.

person `LeftOuterJoin` 
    personExtra 
) -> do 
    on ((personExtra ^. PersonExtraPerson) ==. (person ^. PersonId)) 

için:

person `LeftOuterJoin` 
    personExtra 
) -> do 
    on ((personExtra ?. PersonExtraPerson) ==. just (person ^. PersonId)) 

Ben de Entity PersonExtra den Maybe (Entity PersonExtra) benim sorgu dönüş türü değişti

Geçenlerde bir sorgunun bir parçası değişti.

Şimdi Kalıcı bir PersistNull olasılığını beklediğini ve sorgu benim için çalışıyor.

+0

Dört bağımsız değişkenin her birinin etrafında, her iki '==. Operatörüne 'sahip olmak' ve on altı tane kombinasyonunu denedim. Hiçbiri derlenmiş kodla sonuçlanmaz. – Sean

+0

@Yen ne ile? – bitemyapp

+0

O esqueleto docs göre "bir Belki (Varlık a) bir alan proje" var. – Sean

İlgili konular