【问题标题】:How to find table names having ID (primary key) of a certain value in a hierarchy of tables?如何在表的层次结构中查找具有特定值的 ID(主键)的表名?
【发布时间】:2021-07-11 03:02:32
【问题描述】:

我使用 Oracle 11g 并且有大量表示继承的表,其中基本父表具有主键 NUMBER ID。后续表继承自它,通过共享主键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)的多层层次结构。

如果要将记录插入到具有特定生成ID 的表ORANGE 中,则还必须向父表(CYTRUS、FRUIT 和FOOD)插入记录。假设 ORM 引擎会在此之后进行处理,因为保持这种一致性将非常复杂。

我们还假设层次结构中的每个表都以某个单词结尾(比如说FOOD:FRUIT_FOOD、CYTRUS_FOOD 等)——为了清楚起见,我没有将它包含在上面的图表中.

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

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

【问题讨论】:

    标签: sql oracle inheritance join oracle11g


    【解决方案1】:

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

    Q1。哪些表包含仅使用 SQL 的具有相同 ID 的记录

    您可以使用一系列联合来确定这一点。

    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
     
    

    这将返回一个带有id=123 的表,但更重要的是一个表,其中列出了存在该记录的所有表以及层次结构中的深度/级别。然后您可以使用MAX 或order by 来确定最深层次

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

    这将只返回一条类型最低的记录

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-04
      • 2016-12-16
      • 1970-01-01
      • 2019-11-05
      • 2012-12-29
      相关资源
      最近更新 更多