如何在 table 的层次结构中找到具有特定值 ID(主键)的 table 名称?

How to find table names having ID (primary key) of a certain value in a hierarchy of tables?

我使用 Oracle 11g 并且有大量的 table 表示继承,其中基本父 table 有一个主键 NUMBER ID。后续的table继承自它,通过共享主键NUMBER ID表示。让我们假设有多层这样的继承。

为了获得清晰的画面,让我们使用以下简化结构并假设层次结构非常复杂:

- TABLE FOOD
  - TABLE FRUIT
    - TABLE CYTRUS
      - TABLE ORANGE
      - TABLE GREPFRUIT
  - TABLE VEGETABLE
  - TABLE MEAT
    - TABLE BEEF
      - TABLE SIRLOIN
      - TABLE RIB EYE
    - TABLE CHICKEN

这不是税收,不管这个例子多么愚蠢,假设这样一个多层层次结构使用 Class Table Inheritance (aka Table Per Type Inheritance)

如果要向tableORANGE插入一条记录,生成了某个ID,则必须向父table插入一条记录(CYTRUSFRUITFOOD)。假设 ORM 引擎在此之后负责,因为保持这种一致性将非常复杂。

我们还假设层次结构中的每个 table 都以某个词结尾(假设 FOODFRUIT_FOODCYTRUS_FOOD 等)- I为了清楚起见,没有将其包含在上面的图表中。

问题:我在FOOD table 中找到了一条记录ID = 123 是基于某些条件。由于分层结构,我如何仅使用 SQL 找到包含具有相同 ID 的记录的 table? IE。我的目标是找出 * 层次结构中最低的类型 * 某些 ID 与什么有关。

注意:如果您对较新版本的 Oracle 也有答案,请不要犹豫,只要其他人觉得它有用,就将其包含在内。

假设所有这些 table 都有一列 ID 但您可以根据示例进行调整。

Q1。哪些 table 包含具有完全相同 ID 的记录,仅使用 SQL

您可以使用一系列并集来确定这个,例如

SELECT 
    id, 
    table_type,
    heirarchy_level
FROM (
    SELECT ID, 'FOOD', 1 FROM FOOD
    UNION ALL
    SELECT ID,'FRUIT',2 FROM FRUIT
    UNION ALL
    SELECT ID,'CYTRUS',3 FROM CYTRUS
    UNION ALL
    SELECT ID,'ORANGE',4 FROM ORANGE
    UNION ALL
    SELECT ID,'GREPFRUIT',4 FROM GREPFRUIT
    UNION ALL
    SELECT ID,'VEGETABLE',2 FROM VEGETABLE
    UNION ALL
    SELECT ID,'MEAT',2 FROM MEAT
    UNION ALL
    SELECT ID,'BEEF',3 FROM BEEF
    UNION ALL
    SELECT ID,'SIRLOIN',4 FROM SIRLOIN
    UNION ALL
    SELECT ID,'RIBEYE',4 FROM RIBEYE
    UNION ALL
    SELECT ID,'CHICKEN',3 FROM CHICKEN
) t
WHERE 
    id = 123
 

这将 return 一个带有 id=123 的 table,但更重要的是一个 table 列出所有 table 记录存在的地方以及depth/level 在层次结构中。然后,您可以使用 MAXorder by 来确定最深层次

Q2。与特定 ID 相关的层次结构中的最低类型是什么

这将return只有一个类型最低的记录

SELECT 
    id, 
    table_type,
    heirarchy_level
FROM (
    SELECT ID, 'FOOD', 1 FROM FOOD
    UNION ALL
    SELECT ID,'FRUIT',2 FROM FRUIT
    UNION ALL
    SELECT ID,'CYTRUS',3 FROM CYTRUS
    UNION ALL
    SELECT ID,'ORANGE',4 FROM ORANGE
    UNION ALL
    SELECT ID,'GREPFRUIT',4 FROM GREPFRUIT
    UNION ALL
    SELECT ID,'VEGETABLE',2 FROM VEGETABLE
    UNION ALL
    SELECT ID,'MEAT',2 FROM MEAT
    UNION ALL
    SELECT ID,'BEEF',3 FROM BEEF
    UNION ALL
    SELECT ID,'SIRLOIN',4 FROM SIRLOIN
    UNION ALL
    SELECT ID,'RIBEYE',4 FROM RIBEYE
    UNION ALL
    SELECT ID,'CHICKEN',3 FROM CHICKEN
) t
WHERE 
    id = 123
ORDER BY
    heirarchy_level desc
LIMIT 1