2015-09-27 59 views
0

我正在寻找一个特定的SQL,我发现这里的计算器(Get count of rows in table A that have a reference to table B实现一个复杂的左连接在斯卡拉油滑

但是我似乎无法实现这个油滑SQL解决方案。

SELECT device.*, c.cnt 
FROM device 
LEFT JOIN (SELECT device_id, COUNT(*) AS cnt 
      FROM unit 
      GROUP BY device_id) c 
ON device.id = c.device_id 

我目前的做法失败

slick.SlickException: Unexpected node Select _2 -- SQL prefix: select x2.x3, x2.x4, x2.x5, x2.x6, 

试图运行时/编译查询

val devicesWithUnitCountResult = dbConfig.db.run(TableQueries.devicesWithUnitCount.result) 

当前代码:

def unitCountPerDevice = for { 
    (id, length) <- TableQuery[TDUnit].groupBy(k => k.deviceID).map(k => (k._1, k._2.map(_.id).length)) 
    } yield (id, length) 

    def devicesWithUnitCount = for { 
    (device, unitcount) <- TableQuery[TDDevice].joinLeft(unitCountPerDevice).on(_.id === _._1).map(k => { 
     val u = k._2.getOrElse((0, 0))._2 
     (k._1, u) 
    }) 
    } yield (device, unitcount) 

有人可以帮我找到我在这里失败的地方?

回答

2

试试这个方法

def unitCountPerDevice = TableQuery[TDUnit].groupBy(k => k.deviceID).map(k => (k._1, k._2.map(_.id).length)) 

def devicesWithUnitCount = TableQuery[TDDevice].joinLeft(unitCountPerDevice).on(_.id === _._1).map(d =>(d._1,d._2.map(_._2)))