【问题标题】:Groovy - Joining two SQL Select resultsGroovy - 连接两个 SQL 选择结果
【发布时间】:2015-03-17 16:34:35
【问题描述】:

在解释任何事情之前,我将把我所拥有的留在这里(一个摘要):

rowsTable1(它有一个 SELECT 的结果,它包含 X 行和 Y 列)

rowsTable2(它有一个 SELECT 的结果,它包含 W 行和 Z 列)

我想要的是插入每个 rowsTable1 行,rowsTable2 中的一行,但我需要通过我在 rowsTable1 中的 ID 过滤 rowsTable2。

例如,在 rowsTable1 中,我有一个名为 superID 的元素和另一个名为 ultraID 的元素,而 rowsTable2 也有这些元素,这就是我需要合并两行的内容。

我的问题是,如何过滤 rowsTable2 以仅获取我想要的行?

rowsTable1.eachWithIndex{ rowT1, i ->
    rowT1 << rowT2.firstRow([rowT1.superID],[rowT1.ultraID])
}

像这样?

谢谢!

【问题讨论】:

  • 您可能必须创建一个复合行,因为从查询返回的结果 Row 对象可能是不可变的(最终的)。也许“def ret = rowsTable1.collect { rowT1 -> new HashMap().addAll( rowT1 ).addAll( rowsTable2.find { it.superID == rowT1.superID && it.ultraID == rowT1.ultraID } ) }”?

标签: mysql arrays list join groovy


【解决方案1】:

您似乎想使用“收集”来创建复合地图,因为我认为您不会被允许更改从 SQL 查询返回的行列表。

这是一个应该做你想做的样本:

// if we start with this data (pretend it's what came back from your queries)
def rowsTable1 = [ [superID :1, ultraID :2, c:'a1b2'], [superID :1, ultraID :3, c:'a1b3'] ]
def rowsTable2 = [ [superID :1, ultraID :3, d:'a1b3extra'], [superID :3, ultraID :4, d:'unfound'], [superID :1, ultraID :2, d:'a1b2extra']]

// Now, join the rows to a List of new "row-like" Maps when superID and ultraID are equal.
def ret = rowsTable1.collect { T1row -> 
    [:] << T1row << rowsTable2.find { it.superID == T1row.superID  && it.ultraID  == T1row.ultraID } 
}

ret 现在应该是一个 Map 列表,每个 Map 都是 rowsTable1 中 superID 和 ultraID 的所有唯一组合的“合并”行数据。请注意,rowsTable2 中不包含在 rowsTable1 中的 superID/ultraID 组合的任何数据都将被忽略,并且所有存在于 rowsTable1 中的组合都应存在于 rowsTable2 中。

【讨论】:

  • 谢谢,它成功了。另外,我发现也可以使用 join{},但您的解决方案更适合我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多