【问题标题】:SQL Union for multiple tables多个表的 SQL 联合
【发布时间】:2016-12-20 23:28:51
【问题描述】:

我想在同一个查询中显示两个表的结果,表是相同的,但一个存储历史信息,另一个存储今天的信息(在线),我的表看起来像这样。

历史表:TBL1

T_ID            Resolve             Date
----------      ------------        ------------
AD_1234         GOOD                12/18/16
VF_4569         BAD                 12/19/16
RT_5436         GOOD                12/17/16

在线表:TBL2

T_ID            Resolve             Date
----------      ------------        ------------
AR_2334         BAD                 12/20/16
FT_1362         BAD                 12/20/16
GH_5676         GOOD                12/20/16

预期结果:TBL3

T_ID            Resolve             Date
----------      ------------        ------------
AD_1234         GOOD                12/18/16
VF_4569         BAD                 12/19/16
RT_5436         GOOD                12/17/16
AR_2334         BAD                 12/20/16
FT_1362         BAD                 12/20/16
GH_5676         GOOD                12/20/16

无法创建新表、视图或任何必须通过查询完成的对象。

我不断收到重复的记录,我知道我在两个表上都没有相同的数据。

select o.transaction_id, o.ts_0002
from data_headers1 o
where 
virtual_table_id = '5237260000000002621'
union all
select h.transaction_id, h.ts_0002
from data_headers1_hist h
where virtual_table_id = '5237260000000002621'
 and TO_CHAR(h.ts_0002, 'YYYY/MM/DD HH24:MI:SS') >= '2016/12/01 00:00:00'
 and TO_CHAR(h.ts_0002, 'YYYY/MM/DD HH24:MI:SS') <= '2016/12/30 23:59:59';

【问题讨论】:

  • 你知道你必须使用union..所以你试过了吗?
  • 请至少尝试一下并发布您的代码。
  • UNION ALL 看在上帝的份上
  • 在您的查询末尾添加group by transaction_id, ts_002 having count(*) &gt; 1。这将显示哪些行是重复的。然后在两个表中查找它们 - 看看它们是否实际上在其中一个表中重复,或者它们是否在每个表中都是唯一的,但它们出现在两个表中。然后你必须看看为什么违反了 PK 约束(也许它没有启用?)或者为什么你的表之间可能有重叠,等等。试着一次解决这个小步骤。
  • @Zombraz - 哈哈,这就是菜鸟书的标题!正如他们所说,“计算机太笨了,不会说谎。”每当用户所说的内容与计算机所说的内容之间存在差异时,主要嫌疑人始终是用户。

标签: sql oracle11g


【解决方案1】:

同时:

您必须知道数据的来源 (TBL1/TBL2)

           select 1 as tab,T_ID,Resolve,"Date" from TBL1 t
union all  select 2       ,T_ID,Resolve,"Date" from TBL2 t

附言

更改 h.ts_0002 上的条件
1. 如果 h.ts_0002 上有分区/索引,你正在阻止它们被使用。
2.将所有行的h.ts_0002转成char是浪费资源。

    h.ts_0002 >= timestamp '2016-12-01 00:00:00' 
and h.ts_0002 <  timestamp '2017-01-01 00:00:00'

附: 2

select      transaction_id
           ,count(*)                            as total
           ,count(case tab when 1 then 1 end)   as tab1
           ,count(case tab when 2 then 1 end)   as tab2

from       (select      1 as tab
                       ,o.transaction_id 
            from        data_headers1 o
            where       virtual_table_id = '5237260000000002621'

            union all

            select      2
                       ,h.transaction_id
            from        data_headers1_hist h
            where       virtual_table_id = '5237260000000002621'
                    and h.ts_0002 >= timestamp '2016-12-01 00:00:00' 
                    and h.ts_0002 <  timestamp '2017-01-01 00:00:00'
            )

group by    transaction_id    

having      count(*) > 1

order by    transaction_id
;

【讨论】:

  • 由于事情没有加起来,请在 P.s. 中运行查询。 2 验证
  • 谢谢!让我试一试。
  • 现在它没有显示任何信息,我用单个 UNION 试了一下,它工作了,但大约需要 45 分钟才能获得 34k 条记录。
  • @Zombraz - 这没有意义 - 当您想了解重复项时,为什么要尝试使用 UNION? UNION 会删除重复项,因此使用 UNION 而不是 UNION ALL 运行 Dudu 的诊断查询只是浪费时间。
【解决方案2】:

SQL 是一种声明性语言,简单来说就是你想要一些数据的联合,只要使用术语 UNION(SQL Server 示例):

SELECT T_ID, Resolve, Date From Tbl1 
UNION 
SELECT T_ID, Resolve, Date From Tbl2 

*查询未测试。

注意:如果您需要显示重复的结果,可以将 UNION 替换为 UNION ALL。

【讨论】:

  • @DuduMarkovitz 为什么 union all,你可以根据要求使用 union 或 union all
  • as tbl3 也无效(至少在 Oracle 中)。
  • @AlexPoole 请注意部分:查询未经测试;并且代码在 SQL Server 中是有效的 AFIK
  • 如果我只使用联合,那么查询的处理时间太长了。
  • @Zombraz 你在使用 sql server 吗?
猜你喜欢
  • 2020-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
  • 2013-11-19
相关资源
最近更新 更多