【问题标题】:Combine multiple queries into a single result set with a JOIN, not UNION使用 JOIN 而不是 UNION 将多个查询组合成一个结果集
【发布时间】:2016-09-15 00:42:00
【问题描述】:

我不想争论什么是性能方面更好,我在 Sybase IQ 中工作并且必须将历史表合并到一个选择中,我尝试使用联合,这是不可能的,我用完了工作临时空间,每个时间。我最后的希望是尝试使用连接来做到这一点,但我只是不知道如何从左表中获取所有数据,而从右表中仅将左侧缺少的数据放入单个列中。使用联合,它看起来像这样:

select col,col_1,col_2 from(
    select col,col_1,col_2 from table1
    union
    select col,col_1,col_2 from table2
    union
    select col,col_1,col_2 from table3)x

加入,我需要使用类似的东西:

select col,col_1,col_2 from(
    select a.col,b.col,c.col,
           a.col_1,b.col_1,c.col_1,
           a.col_2,b.col_2,c.col_2 
    from table1 a
    left join table2 b on a.col = b.col 
    left join table3 c on a.col = c.col 

    group by a.col,b.col,c.col,
           a.col_1,b.col_1,c.col_1,
           a.col_2,b.col_2,c.col_2)x

仍然使用这个 sql,我无法在我的选择中得到最后 3 列(这样我会得到一个错误,因为每列有 3 个集合),这就是我试图实现的目标。

【问题讨论】:

  • 确定你想要UNION而不是UNION ALL吗?前者有很多工作与搜索重复项有关,而后者只是将结果粘合在一起。连接不适用于给定的问题。
  • 我有重复,所以最终我需要有一个 group by 或 distinct,但我会尝试 union all
  • 那你倒霉了。 UNIONUNION ALL + DISTINCT 之间应该没有区别。如果我没记错的话,你唯一的机会是摆脱重复表中是否有重复项?然后在联合之前使用SELECT DISTINCT。您可以预见表格之间是否存在重叠,例如一月/二月的一张桌子,二月/三月的另一张桌子?然后在联合之前使用WHERE自己消除重复数据。

标签: sql join sybase sap-iq


【解决方案1】:

这可能无济于事,具体取决于您超出临时空间限制的程度,但您是否尝试过将 2 个表组合成一个临时表,以减少在 select 上使用最终 Union 进行重复数据删除的过程中成本出来了吗?

类似...

Create table #temp (col, col_1, col_2)

Insert into #temp
Select col, col_1, col_2 from table1
Union 
Select col, col_1, col_2 from table2
Go

Select col, col_1, col_2, from #temp
Union 
Select col, col_1, col_2 from table3

【讨论】:

  • 可悲的是,这也不起作用,因为最后 temp# 表对于最后一个联合来说太大了,但还是谢谢
  • 仅在最后一个 select 语句中切换到 Union all 而不是 union,仍然会耗尽您的临时空间吗?我知道这不是您想要的,但我正试图更好地理解正在发挥作用的空间限制。
【解决方案2】:

你可以试试这个

select col,col_1,col_2 from(
    select coalesce (a.col,b.col,c.col) as col,
           coalesce (a.col_1,b.col_1,c.col_1) as col_1,
           coalesce (a.col_2,b.col_2,c.col_2) as col_2 
    from table1 a
    left join table2 b on a.col = b.col 
    left join table3 c on a.col = c.col 

    group by coalesce(a.col,b.col,c.col),
           coalesce(a.col_1,b.col_1,c.col_1),
           coalesce(a.col_2,b.col_2,c.col_2))x

告诉我这是否对你有帮助

【讨论】:

  • 我有一个类似的想法,但它只适用于完全外连接,我可能需要扩展所有列上的连接键,以获得正确的数据......我会尝试写加入有点不同
猜你喜欢
  • 2015-04-04
  • 1970-01-01
  • 2021-01-30
  • 1970-01-01
  • 1970-01-01
  • 2016-10-05
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多