2017-01-18 52 views
1

我有兩個Slick查詢其通過過濾器返回count,他們是這樣的:斯卡拉油滑無法計數聯合查詢

val firstCount = query.filter(_.someCond).length 
val secondCount = query.filter(_.someCond).length 
val unionCount = firstCount union secondCount //Place with the problem 

油滑可以使工會單查詢,而不計 - 這回,而不是Rep[Int]QueruBase

我的目標是在一次sql查詢期間採取firstCountsecondCount

+0

我想你可以這樣做:'val a1 = q1.length.result; val a2 = q2.length.result; val action = DBIO.sequence(Seq(a1,a2))'並提取第一個和第二個結果... –

+0

上面實際上並沒有在單個查詢中執行它(正如問題中指定的那樣)。 –

+0

'val unionCount =(query.filter(_。someCond)union union query.filter(_。someCond)).length'? – Roman

回答

0

哦,男孩,我可以看到你不會喜歡這個,但這是我能夠在沒有太長時間調查的情況下找到的唯一方法。

這是比解決方案更多的解決方法。 @ insan-e解決方案(簡單地使用兩個查詢)實際上可能更加可行(恕我直言,這是 - 但我不知道你的約束)。

下面是查詢:

TABLE1 
     .filter(_.someColumn === "1stFilterValue") // your filter basically 
     .map(_ => LiteralColumn(1)) 
     .union { 
     TABLE2 
      .filter(_.someColumn === "2ndFilterValue") // again your filter 
      .map(_ => LiteralColumn(2)) 
     }.groupBy { marker => 
     marker 
     }.map { case (marker, grouped) => 
     (marker, grouped.length) 
     } 

這將產生下面的查詢(假設我有柱name - 用於過濾):

select x2, count(1) 
from (
    select 1 as x2 
    from "TABLE1" 
    where "NAME" = 'Mike' 
    union 
    select 2 as x2 
    from "TABLE2" 
    where "NAME" = 'Tom' 
) 
group by x2 

將返回以下結果:

DEBUG s.j.J.benchmark - Execution of prepared statement took 50ms 
DEBUG s.j.S.result - /----+----------\ 
DEBUG s.j.S.result - | 1 | 2  | 
DEBUG s.j.S.result - | X2 | COUNT(1) | 
DEBUG s.j.S.result - |----+----------| 
DEBUG s.j.S.result - | 1 | 1  | 
DEBUG s.j.S.result - | 2 | 1  | 
DEBUG s.j.S.result - \----+----------/ 

請記住,特定的行不會出現在結果中,如果c ount爲0(無行)。你需要在你的代碼中處理這個問題!

+0

我已經試過這樣的解決方案 - '選擇x2,count(1) from( select 1 from x2 from「TABLE1」 where'NAME' =「邁克」 工會 通過X2 從「TABLE2」 其中「NAME」 =「湯姆」 ) 組中選擇2爲X2 '這是錯的,舉例來說,如果我在'x2'有數千行,在結果我將有成千上萬而不是單身。 – pacman

+0

我不知道你上面說的是什麼。你會有兩個結果嗎?一次查詢(工會的第一部分),另一次查詢(工會的第二部分)。這不是你想要的嗎? 基本上結果是兩個指標,無論您選擇哪個標記(上面的標記是'1'和'2')。 –