交叉引用 MASTER Table 与 ORACLE SQL 中的子表
Cross Referencing MASTER Table with SUB TABLES in ORACLE SQL Developer
我对 Oracle SQL Developer 还很陌生,我有一个想尝试的想法,但我不确定这怎么可能(无论如何这可能只是一个愚蠢的问题)
以下是案件的事实:
- 我在 oracle 中有一个模式,其中包含许多 table。大约100个左右。
- 在这 100 个 table 中,我们称之为 'EVENT TABLES' 的大约 20 个记录了数据库中发生的各种类型的事件。每个事件都是独一无二的。
- 19 table 是子类别事件 table。基本上,table 是按类型分类的。 (即一个事件 table 用于更改客户联系信息,另一个事件 table 用于土地所有权的更改,另一个事件 table 用于支付信息等)
- 有一个事件 table 是主事件 TABLE,它包含所有事件,无论类型如何。此 table 加载了来自 19 个子类别 table 的事件。如果一个事件被记录到一个特定的 sub table,它也会被记录在 MASTER TABLE
- 所有 table 都有一个名为 'EVENT_NUMBER_ID' 的列,它是针对发生的事件记录的唯一编号。该列是19个子类table与主table
的join列
我想构建一个查询,将事件编号从主 table 交叉引用到它的特定子 table。例如,有人给了我一个事件编号。我可以去 EVENT MASTER TABLE 那里找到它,但我也想找出它所在的子 table。
如果您只想在单个查询中确定 table 与 event
相关的子类别,您需要将 event
table 加入每个子类别 tables。这可能不是对 运行 最有效的查询,但是
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
从 table 设计的角度来看,如果您要有子类别 table,您通常会将子类别存储在 event
table 中以便告诉您加入哪个 table 而不是稍后尝试推断该信息。您现在可以添加该列,使用我发布的查询来回填信息,然后继续填充该列。
而不是连接到 19 tables,如果你真的只是在做一个单行查找,写一个检查 [=21] 的 PL/SQL 函数可能更有效=]s 按可能性排序(即,如果一个事件子类别占所有事件的 20%,则首先检查 table),一旦找到匹配项就停止查找。
Justin 的方法很管用。如果事件编号在所有列中都已编入索引,我建议如下:
创建如下所示的视图
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
(如果有意义,您可以添加更多列)
现在您需要做的就是在该视图中查询给定的事件编号。如果事件编号在所有表上都被索引,它将非常快。
我对 Oracle SQL Developer 还很陌生,我有一个想尝试的想法,但我不确定这怎么可能(无论如何这可能只是一个愚蠢的问题)
以下是案件的事实:
- 我在 oracle 中有一个模式,其中包含许多 table。大约100个左右。
- 在这 100 个 table 中,我们称之为 'EVENT TABLES' 的大约 20 个记录了数据库中发生的各种类型的事件。每个事件都是独一无二的。
- 19 table 是子类别事件 table。基本上,table 是按类型分类的。 (即一个事件 table 用于更改客户联系信息,另一个事件 table 用于土地所有权的更改,另一个事件 table 用于支付信息等)
- 有一个事件 table 是主事件 TABLE,它包含所有事件,无论类型如何。此 table 加载了来自 19 个子类别 table 的事件。如果一个事件被记录到一个特定的 sub table,它也会被记录在 MASTER TABLE
- 所有 table 都有一个名为 'EVENT_NUMBER_ID' 的列,它是针对发生的事件记录的唯一编号。该列是19个子类table与主table 的join列
我想构建一个查询,将事件编号从主 table 交叉引用到它的特定子 table。例如,有人给了我一个事件编号。我可以去 EVENT MASTER TABLE 那里找到它,但我也想找出它所在的子 table。
如果您只想在单个查询中确定 table 与 event
相关的子类别,您需要将 event
table 加入每个子类别 tables。这可能不是对 运行 最有效的查询,但是
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
从 table 设计的角度来看,如果您要有子类别 table,您通常会将子类别存储在 event
table 中以便告诉您加入哪个 table 而不是稍后尝试推断该信息。您现在可以添加该列,使用我发布的查询来回填信息,然后继续填充该列。
而不是连接到 19 tables,如果你真的只是在做一个单行查找,写一个检查 [=21] 的 PL/SQL 函数可能更有效=]s 按可能性排序(即,如果一个事件子类别占所有事件的 20%,则首先检查 table),一旦找到匹配项就停止查找。
Justin 的方法很管用。如果事件编号在所有列中都已编入索引,我建议如下:
创建如下所示的视图
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
(如果有意义,您可以添加更多列)
现在您需要做的就是在该视图中查询给定的事件编号。如果事件编号在所有表上都被索引,它将非常快。