Sql server Anorm SQL将列表折叠为类结果

Sql server Anorm SQL将列表折叠为类结果,sql-server,scala,playframework,anorm,Sql Server,Scala,Playframework,Anorm,请恕我直言。我不太清楚这个问题怎么表达 我刚接触scala,仍在学习该语言的复杂性。我有一个项目,其中我需要的所有数据都包含在一个具有如下布局的表中: CREATE TABLE demo_data ( table_key varchar(10), description varchar(40), data_key varchar(10), data_value varchar(10) ); case class Tab ( tableKey: String, description: Stri

请恕我直言。我不太清楚这个问题怎么表达

我刚接触scala,仍在学习该语言的复杂性。我有一个项目,其中我需要的所有数据都包含在一个具有如下布局的表中:

CREATE TABLE demo_data ( table_key varchar(10), description varchar(40), data_key varchar(10), data_value varchar(10) );
case class Tab ( tableKey: String, description: String, valA: String, valB: String, valC: String )
object Tab {
 val simple = {
  get[String]("table_key") ~
  get[String]("description") ~
  get[String]("val_a") ~
  get[String]("val_b") ~
  get[String]("val_c") map {
  case tableKey ~ description ~ valA ~ valB ~ valC => Tab(table_key, description, valA, valB, valC)
  }
 }
 def list(tabKey: String) : List[Tab] = {
  DB.withConnection { implicit connection =>
   val tabs = SQL(
     """
       SELECT DISTINCT p.table_key, p.description,
          a.data_value val_a,
          b.data_value val_b,
          c.data_value val_c
        FROM demo_data p
             JOIN demo_data a on p.table_key = a.table_key and a.data_key = 'A'
             JOIN demo_data b on p.table_key = b.table_key and b.data_key = 'B'
             JOIN demo_data c on p.table_key = c.table_key and c.data_key = 'C'
        WHERE p.table_key = {tabKey}
      """
     ).on('tabKey -> tabKey).as(Tab.simple *)
  }

  return tabs
 }
}
其中table_key列包含我正在搜索的主键,并且该描述会对具有该table_key的每一行重复。此外,数据键和数据值对中还包含描述性键和值

我需要将一组数据_键合并到我的结果类中,以便该类最终如下所示:

CREATE TABLE demo_data ( table_key varchar(10), description varchar(40), data_key varchar(10), data_value varchar(10) );
case class Tab ( tableKey: String, description: String, valA: String, valB: String, valC: String )
object Tab {
 val simple = {
  get[String]("table_key") ~
  get[String]("description") ~
  get[String]("val_a") ~
  get[String]("val_b") ~
  get[String]("val_c") map {
  case tableKey ~ description ~ valA ~ valB ~ valC => Tab(table_key, description, valA, valB, valC)
  }
 }
 def list(tabKey: String) : List[Tab] = {
  DB.withConnection { implicit connection =>
   val tabs = SQL(
     """
       SELECT DISTINCT p.table_key, p.description,
          a.data_value val_a,
          b.data_value val_b,
          c.data_value val_c
        FROM demo_data p
             JOIN demo_data a on p.table_key = a.table_key and a.data_key = 'A'
             JOIN demo_data b on p.table_key = b.table_key and b.data_key = 'B'
             JOIN demo_data c on p.table_key = c.table_key and c.data_key = 'C'
        WHERE p.table_key = {tabKey}
      """
     ).on('tabKey -> tabKey).as(Tab.simple *)
  }

  return tabs
 }
}
这将返回我想要的,但是我有30多个数据键,我希望以这种方式检索,并且与自身的连接很快变得不可管理。如中所示,查询运行了1.5个小时,并在磁盘空间用完之前使用了价值20GB的临时表空间

因此,我使用“where data_key in('a','B','C',…)”,创建了一个单独的类来检索给定表键的数据键和数据值列表,现在我想将返回的列表“展平”到一个结果对象中,该对象将包含valA,valB,valC。。。在里面。我仍然希望将展平对象的列表返回给调用例程

让我试着把我想完成的事情理想化

获取标题结果集和详图结果集,从详图结果集中提取关键点,以填充标题结果集中的其他元素/属性,并生成包含标题结果集的所有元素以及详图结果集中选定属性的类列表。因此,我得到了一个TabHeader(tabKey,Desc)列表,并为每个列表检索了一个感兴趣的TabDetail(DataKey,DataValue)列表,然后提取出DataKey='a'所在的元素,并将DataValue元素放在Tab(valA)中,对DataKey='B','C',执行同样的操作。。。完成后,我希望生成一个选项卡(tabKey、Desc、valA、valB、valC等)来代替相应的TabHeader。我很可能会在Java中蒙混过关,但我将此视为一个学习机会,并想知道在Scala中实现这一点的好方法


我觉得scala映射应该可以满足我的需要,但我还不能准确地跟踪到底是什么。

您使用的是哪种DBMS?您标记了sql server,但您有一个不是sql server数据类型的varchar2。我怀疑这是一个EAV表,这就是为什么您必须一次又一次地将此表连接到自身的原因。是否更改了问题以澄清?数据库是SQLServer,我输入了代码,很抱歉使用了VarChar2。所有内容都在一个表中,而不是标题表和详细信息表。我希望生成一个具有各种详细描述的类作为该类的属性。我没有设计桌子,无法更改布局。我感兴趣的每个data_键都应该作为类中的一个属性,其值将包含相应的data_值。我不知道我能说得清楚多少。是的,这是一个EAV表。要尽快处理SQL结果并只在内存中保留所需内容,您可以使用Anorm的流式支持:;在master(检查2.3.7)中,使用折叠操作更新流。