Slick生成嵌套SQL

时间:2017-11-26 16:04:21

标签: scala slick

我试图制作虚拟表并在需要时将其加入真实表。 我出于兼容性原因使用了slick 3.0。 数据库是MySql。

代码如下所示:

def linkTable(data: Seq[(Int, Int)]): Query[(Rep[Int], Rep[Int]), (Int, Int), Seq] = {

      val tableRows: Seq[Query[(ConstColumn[Int], ConstColumn[Int]), (Int, Int), Seq]] = {
        data.map { case (groupId, merchantId) =>
          Query(groupId, merchantId)
        }
      }

      if (tableRows.isEmpty) {
        Query(-1, -1)
      } else {
        tableRows.reduceLeft(_ union _)
      }
    }

结果类型:

Query[(Rep[Int], Rep[Int]), (Int, Int), Seq]

正是我能够将虚拟表集成到代码库中所需要的。

函数 linkTable 工作正常,除了它生成嵌套的sql:

    (SELECT x7.x8  AS x9,
            x7.x10 AS x11
    FROM   (
             SELECT x12.x13 AS x8,
                    x12.x14 AS x10
             FROM   (
                      SELECT x15.x16 AS x13,
                             x15.x17 AS x14
                      FROM   (
                               SELECT 1 AS x16,
                                      3 AS x17
                               FROM   DUAL
                               UNION
                               SELECT 2 AS x16,
                                      3 AS x17
                               FROM   DUAL) x15
                      UNION
                      SELECT 3 AS x13,
                             3 AS x14
                      FROM   DUAL) x12
             UNION
             SELECT 4 AS x8,
                    3 AS x10
             FROM   DUAL) x7
             UNION
             SELECT 5 AS x9,
                    3 AS x11
             FROM   DUAL) x18

导致以下错误:

java.sql.SQLException: Too high level of nesting for select

我需要的是让这些工会变平:

    (SELECT 1 AS x7,
           3 AS x8
    FROM   DUAL
    UNION
    SELECT 2 AS x7,
           3 AS x8
    FROM   DUAL
    UNION
    SELECT 3 AS x7,
           3 AS x8
    FROM   DUAL
    UNION
    SELECT 4 AS x7,
           3 AS x8
    FROM   DUAL
    UNION
    SELECT 5 AS x7,
           3 AS x8
    FROM   DUAL
    ) x9

有人知道如何通过光滑的3.0实现它? 从字符串进行查询是有效选项,但结果类型应该是正确的。

0 个答案:

没有答案