Sql 平滑查询=>;重复结果

Sql 平滑查询=>;重复结果,sql,scala,playframework,slick,play-slick,Sql,Scala,Playframework,Slick,Play Slick,我得到了这些模型(简化): 使用此查询时: for { r <- Restaurants e <- Employees if r.ownerId === userId || (e.userId === userId && e.restaurantId === r.id) } yield r 到目前为止没有问题。但当我插入这些数据时: User(1, "Foo") User(2, "Fuu") Restaurant(1, 2, "Fuu")

我得到了这些模型(简化):

使用此查询时:

for {
    r <- Restaurants
    e <- Employees
    if r.ownerId === userId || (e.userId === userId && e.restaurantId === r.id)
  } yield r
到目前为止没有问题。但当我插入这些数据时:

User(1, "Foo")
User(2, "Fuu")
Restaurant(1, 2, "Fuu")
Restaurant(2, 1, "Foo")
Restaurant(3, 1, "Bar")
Employee(2, 2)
Employee(2, 3)
然后尝试查询,我得到以下结果:

List(Restaurant(1, 2, "Fuu"), Restaurant(1, 2, "Fuu"), Restaurant(2, 1, "Foo"), Restaurant(3, 1, "Bar))
我不明白为什么
餐厅(1,2,“Fuu”)
出现了两次

(我正在使用带有url的
org.h2.Driver
,jdbc:h2:mem:play)

我遗漏了什么吗?

为什么要退回4行 交叉连接很硬;您对SQL查询的要求是:

——餐厅和员工所有行的笛卡尔积
Employee.user|id | Employee.restaurant|id | restaurant.name | restaurant.owner|id
2 | 2 | Fuu | 2
2 | 3 | Fuu | 2
2 | 2 | Foo | 1
2 | 3 | Foo | 1
2 | 2 |巴| 1
2 | 3 |巴| 1
--过滤掉那些属于所有者的内容!=2.
Employee.user|id | Employee.restaurant|id | restaurant.name | restaurant.owner|id
2 | 2 | Fuu | 2
2 | 3 | Fuu | 2
--并将该集合与员工的用户_id=2的集合相结合
--餐厅ID等于员工的餐厅ID
Employee.user|id | Employee.restaurant|id | restaurant.name | restaurant.owner|id
2 | 2 | Foo | 1
2 | 2 |巴| 1
如何修复它 将其改为显式左联接:

for {
    (r, e) <- Restaurants leftJoin Employees on (_.id = _.restaurantId)
    if r.ownerId === userId || e.userId === userId
} yield r
Thx,它正在工作=)。对于笛卡尔乘积示例,Thx帮助我理解=)
List(Restaurant(1, 2, "Fuu"), Restaurant(1, 2, "Fuu"), Restaurant(2, 1, "Foo"), Restaurant(3, 1, "Bar))
for {
    (r, e) <- Restaurants leftJoin Employees on (_.id = _.restaurantId)
    if r.ownerId === userId || e.userId === userId
} yield r
for {
  r <- Restaurants
  if r.ownerId === userId ||
     Employees.filter(e => e.userId === userId && e.restaurantId === r.id).exists
} yield r