SQL查询使用join提取集合

时间:2014-12-01 03:58:47

标签: sql collections

我有两个数据库表:

  

TABLE_1(ID,ThatID,OtherField)

     

TABLE_2(ThatID,Field2,TheseOthers)

ID& ThatIDTABLE_1& TABLE_2ThatIDTABLE_1中重复Field2次。 ThatID取决于TABLE_2上的ThatID

在结果中,我需要为每个TABLE_1提取以下对象:

  

ThatID,Field2,Collection< OtherField>

执行此操作的SQL查询是什么?

我无法改变表结构 - 这两个是我应该处理的。

我不能使用Hibernate--我在这个系统中只有JDBC。

我正在寻找一个基于SQL的解决方案 - 而不是Java解决方案。所以,查询 OtherField,将每个ThatID的{​​{1}}值添加到集合中,然后获取 来自另一个表的匹配Field2不是解决方案。

我对SQL很生疏,并在寻找有效的解决方案。

TIA。

// =================================

修改

  

TABLE_1:

     

ID:ThatID OtherField

     

1 z4 other87

     

2 z4 other39

     

3 z4 this1

     

4 x2 axy66

     

5 x2 tyz44

     

TABLE_2:

     

ThatID Field2 ThatOthers

     

x2 apples somethingElse

     

z4橘子其他人

     

y4 Pears yetAnother

应生成2个对象:

  

z4,苹果,< Other87,Other39,this1>

     

x2,橙子,< axy66,tyz44>

// =============================================

EDIT2:

在此示例中,我是否可以直接从查询中为OtherField的{​​{1}}行ThatID行添加多个TABLE_1条目?我正在使用SQL服务器。

2 个答案:

答案 0 :(得分:0)

根据我了解您的问题,您需要根据名为ThatID的常用列加入以匹配您的表格。

SELECT DISTINCT TABLE_1.ThatID, Field2,
stuff((
        select ',' + TABLE_1.otherfield
        from TABLE_1
        where TABLE_2.thatid = TABLE_1.thatid
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')    
FROM TABLE_2 INNER JOIN TABLE_1 ON TABLE_2.ThatID = TABLE_1.ThatID
GROUP BY TABLE_1.ThatID,TABLE_2.ThatID, Field2, OtherField

答案 1 :(得分:0)

您是否在寻找group_concat(根据您的问题历史假设mysql - 其他数据库采用类似方法)?

select that.id, that.field2, group_concat(this.otherfield)
from that 
  inner join this on that.id = this.thatid
group by that.id, that.field2

修改,根据您对sql server的修改,您正在寻找stuff for xml {/ 1>}:

select that.id, that.field2, 
    stuff((
          select ',' + this.otherfield
          from this
          where that.id = this.thatid
          FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
from that