在ORACLE SQL Developer中使用SUB TABLES交叉引用MASTER表

时间:2015-08-28 19:34:49

标签: sql oracle unique cross-reference

我对Oracle SQL Developer非常陌生,我有一个想要尝试的想法,但我不确定它是如何可能的(反正这可能是一个愚蠢的问题)

以下是案件的事实:

  • 我在oracle中有一个包含许多表的模式。大约100左右。
  • 在这100个表中,其中约20个是我们所谓的“EVENT TABLES”,用于记录数据库中发生的各种类型的事件。每个EVENT都是独一无二的。
  • 19个表是子类EVENT表。基本上,按类型分类的表格。 (即客户联系信息变更的事件表,LAND OWNERSHIP变更的另一个事件表,付款信息的另一个事件表等)
  • 有一个EVENT表是MASTER TABLE,它包含所有事件,无论其类型如何。该表加载了19个子类别表中的事件。如果事件记录到一个特定的子表中,它也会记录在MASTER TABLE中
  • 所有表都有一个名为“EVENT_NUMBER_ID”的列,该列是针对发生的事件记录的唯一编号。此列是19个子类别表和主表
  • 之间的连接列

我想构建一个查询,它将主表中的EVENT NUMBER交叉引用到它的特定子表。例如,某人给了我一个活动编号。我可以去EVENT MASTER TABLE找到它,但我也想找出它所在的子表。

2 个答案:

答案 0 :(得分:1)

如果您只想在单个查询中确定event与哪个子类别表相关,则需要将event表连接到每个子类别表。这可能不是最经常运行的最有效查询,但是

SELECT e.event_number_id,
       (case when sc1.event_number_id IS NOT NULL then 'SC1'
             when sc2.event_number_id IS NOT NULL then 'SC2'
             ...
             when sc19.event_number_id IS NOT NULL then 'SC19'
         end)
  FROM event e
       LEFT OUTER JOIN subcategory1 sc1
         ON( e.event_number_id = sc1.event_number_id )
       LEFT OUTER JOIN subcategory2 sc2
         ON( e.event_number_id = sc2.event_number_id )
       ... 
       LEFT OUTER JOIN subcategory19 sc19
         ON( e.event_number_id = sc19.event_number_id )
 WHERE e.event_number_id = xxx

从表格设计的角度来看,如果您要使用子类别表,您通常会将子类别存储在event表中,以告诉您要加入哪个表而不是试图稍后推断出这些信息。您现在可以添加该列,使用我发布的查询来回填信息,然后填充该列。

如果你真的只是在进行单行查找,而不是加入19个表,那么编写一个按可能性顺序检查表的PL / SQL函数可能更有效(即,如果有的话) event子类别构成所有事件的20%,首先检查该表,并在找到匹配后停止查找。

答案 1 :(得分:1)

贾斯汀的方式会很好。如果事件编号在所有列中编入索引,我建议如下:

创建如下视图

     Select 'Type1' as EventType, event_number_id from event1
       union all
     Select 'Type2' as EventType, event_number_id from event2
       union all
     Select 'Type3' as EventType, event_number_id from event3
       union all
     Select 'Type4' as EventType, event_number_id from event4
       union all
         -- ...
     Select 'TypeN' as EventType, event_number_id from eventN

(如果有意义,可以添加更多列)

现在您需要做的就是查询给定事件编号的此视图。如果在所有表上索引事件编号,那么它将超快。