[英]Scala Slick: How to do an except join (left outer join with is null)?
[英]Outer join with Scala Slick
我有兩個表, User
和UserBusinessPartnerIds
User(id, name, email, whatever)
UserBusinessPartnerIds(userId, bpId)
我正在嘗試檢索用戶和業務合作伙伴ID的列表。
以下查詢工作正常!
database withSession { implicit session: Session =>
val query = (for {
(user, userBpid) <- Users leftJoin UserBusinessPartners on (_.id is _.userId)
if user.email === email &&
user.password === password &&
user.active === true &&
userBpid.dateFrom < today &&
userBpid.dateTo > today
} yield (user.id, userBpid.bpId.?))
val results = query.list
results.headOption.map( row => User(row._1, email, password, results.map(_._2).flatten.toSet))
}
當然,代碼的結尾令人發指。 但是無所謂。
問題是,我希望進行OUTER加入。 因此,如果用戶在另一個表中沒有與業務伙伴ID對應的行,我仍然希望獲得該用戶。
有任何想法嗎?
編輯-編輯的問題實際上是正確的。 我仍然想返回一個用戶,即使他們沒有與之關聯的業務伙伴ID
hmmm,生成的sql是什么樣的? 應該是左外部聯接。
我懷疑問題在於:
userBpid.dateFrom < today && userBpid.dateTo > today
由於用戶+空用戶伙伴行,由於可能將條件應用於空值而無法返回; 即,當關聯的業務伙伴ID行不存在時,它們將永遠不會返回true。
作為測試,請執行println(q.sqlStatement)
或查看查詢日志,並在有或沒有上述查詢條件的情況下手動運行查詢。
編輯未測試,但嘗試此操作,將用戶業務表別名為一個內部,一個外部。 您可能會遇到一個非唯一的表別名編譯器錯誤,這是我在上一次嘗試一些外部連接魔術的嘗試中發生的
val q =
for{
(u,upo) <- Users leftJoin UserBusinessPartners on (_.id is _.userId)
if(u.email is email) && (u.password is password) && (u.active is true)
up <- UserBusinessPartners
if(u.id is up.userId) && (up.dateFrom < today) && (up.dateTo > today)
_ <- Query groupBy(u.id)
} yield (u.id, upo.bpId.?)
您需要在聯接之前過濾UserBusinessPartners表,這將為您提供沒有業務合作伙伴的用戶。 就像是 :
database withSession { implicit session: Session =>
userBP = UserBusinessPartners.filter(ubp => ubp.dateFrom < today && ubp.dateTo > today)
val query = (for {
(user, userbp) <- Users leftJoin userBP on (_.id is _.userId)
if user.email === email &&
user.password === password &&
user.active === true
} yield (user.id, userbp.bpId.?))
val results = query.list
results.headOption.map( row => User(row._1, email, password, results.map(_._2).flatten.toSet))
}
篩選器將顯示僅包含所需業務伙伴的表視圖,左側聯接將列出所有用戶。
您的查詢失敗,原因是:
userBpid.dateFrom <今天&& userBpid.dateTo>今天
因為使用空userBpid選擇的行將由於上述條件而被過濾掉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.