【问题标题】:how to join or Union result of 2 sql queries in single result set如何在单个结果集中加入或联合 2 个 sql 查询的结果
【发布时间】:2009-08-20 06:57:27
【问题描述】:

我有 2 个表(两个单独的 SQL 查询的结果,此结果将包含在 List<Object> 中,其中每个对象代表数据库的 1 行)

Table_1

  • Dimension_1
  • Dimension_2
  • 事实_1

Table_2

  • Dimension_1
  • Dimension_2
  • 事实_2

我想在 RESULTSET AS 中加入这两个结果

Table_Resultant

  • Dimension_1
  • Dimension_2
  • 事实_1
  • 事实_2

由于系统中查询部分的一些复杂性,我无法对结果表发出单个查询,并且由于这些限制,我必须将两个结果列表 <object>(table_1 & table_2) 加入 table_resultant每次

解决问题的可能方法是什么?

在 MYSQL 中创建一个临时表(连接两个结果集)可能是一个潜在的解决方案??? 是的,我可以在 Mysql 中创建临时表

YES,"COMPLEX" SQL 允许在 2 个“结果”上获取 resultant_table

【问题讨论】:

  • 您好,我不太明白,为什么不能使用sql命令? JOIN 不会成功吗?
  • 我很困惑 - 为什么你不能对结果集使用单个查询?
  • 不会加入创建两列?如果要维护单个列,则需要用 DISTINCT 包装的 UNION。
  • @Rax:Table_Resultant 中有两个事实列(Fact_1,Fact_2)
  • 是的,我可以使用 MYSQL 创建临时表

标签: java sql mysql


【解决方案1】:

所以你可以做 Union 但不能 Join ?您能否澄清您是否需要在两个源表中匹配 Dimension1 和 Dimension2 的值?或者,如果您只需要从两个表中获取所有值并将它们合并到结果中(在这种情况下,是的,联合可能会解决问题)

您需要一个完整的外部联接,假设这在您的查询系统中是不可能的,这里是一个解决方案的概要,假设:

1. Fact1 and 2 are >=0 ints and 
2. no row in tablex where factx is null.

Select dimension1,dimension2,max(Fact1),max(Fact2) 
From (Select dimension1, dimension2, Fact1, -1 as Fact2 
      UNION 
      Select dimension1, dimension2, -1 , Fact2 ) 
GROUP by dimension1, dimension2 

这不是最终的解决方案,当连接不匹配时,它不会为 fact1 或 2 返回 NULL。为此,您当然必须使用 CASE,或者如果您的查询系统认为 max(NULL,1)=1

Union 的完整解决方案:

Select dimension1, dimension2,  
       CASE WHEN max(Fact1) = -1 THEN NULL ELSE Fact1 END,  
       CASE WHEN max(Fact2) = -1 THEN NULL ELSE Fact2 END,  
From (Select dimension1, dimension2, Fact1, -1 as Fact2  
      UNION 
      Select dimension1, dimension2, -1 , Fact2 )  
GROUP by dimension1, dimension2  

如果您可以在两个结果集上执行 FULL OUTER JOIN,那么它将如下所示

Select isnull(t1.dimension1, t2.dimension1),   
       isnull(t1.dimension2,t2.dimension2),  
       t1.fact1,  
       t2.fact2  
FROM table1 t1 
OUTER JOIN table2 t2   
ON t1.dimension1=t2.dimension1 and t1.dimension2=t2.dimension2   

【讨论】:

  • 你好 PatRedway,是的,我必须匹配两个表中的 Dimension1 和 Dimension2,如果 CASE 的 fact1 存在且 fact2 不存在,则检索结果表,而不是在这种情况下,行看起来像 dim1||dim2 ||Fact1||null
  • 实际上你需要的是一个完整的外部连接。如果这是不可能的,那么这里是您的解决方案的灵感,假设 1-Fact1 和 2 >=0 整数 2-tablex 中没有行,其中 factx 为空 Select dimension1, dimension2, max(Fact1), max(Fact2) From ( Select dimension1 , dimension2, Fact1, -1 as Fact2 UNION Select dimension1, dimension2, -1 , Fact2 ) group by dimension1, dimension2 这不是最终的解决方案,当连接不匹配时,不会为 fact1 或 2 返回 NULL。为此,您当然必须使用 CASE,或者如果您的查询系统认为 max(NULL,1)=1
  • 对不起,我是stackoverflow的新手:(
  • 我试图复制到答案中。 (有时更新原始答案比添加 cmets 更好。)
  • 对我来说神秘的是,我使用的查询系统是否允许任何复杂的 SQL。
【解决方案2】:

很难回答,因为您还没有真正详细地解释您能做什么和不能做什么。乍一看,您正在尝试生成一些数据,这些数据将是简单 JOIN 的结果 - 但您说您不能这样做?如果不允许你做这样一个基本的 SQL 事情,那么很难想象你能做什么。我们需要知道限制的性质。

你可以使用存储过程吗?

【讨论】:

  • 是的,我可以使用 MYSQL 创建临时表
  • 请不要这样用大写,看起来你在喊。我的问题不是你是否可以使用临时表。这正是你所拥有的限制。要使用临时表,您至少需要与 JOIN 一样复杂的 SQL。你说你不能使用 JOIN,但我们不知道你能做什么。
  • 好的,我会保留这个东西以备将来使用,唯一的限制是我不能为结果表(这是非常明显的解决方案)发出单个查询(如 JOIN 以检索 2 RESULT),除了我可以在两个结果上使用任何东西,比如加入或任何其他东西来获取结果表******IMP TO NOTE******我在检索2结果时无法应用JOIN,但可以进行复杂查询或加入这两个结果....
猜你喜欢
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多