【问题标题】:Oracle, merge tables, insert missing values while increasing idOracle,合并表,在增加id的同时插入缺失值
【发布时间】:2016-03-22 16:35:57
【问题描述】:

我有两张表,一张有值(FACT 表),我试图将一列合并到一个键/值表(FACT_ATTRIBUTE 表)中。键是数字,值是 varchar2。 FACT_ATTRIBUTE 表中已经有一些条目。我正在尝试编写一个合并新条目的包过程。我们正在尝试取消触发器和序列。我有一些 SQL 可以选择表中尚未包含的条目,但我正在为如何创建索引键值而苦苦挣扎。键应该比当前最大值大一。

例如,假设 FACT_ATTRIBUTE 表已经有到键 5 的条目。新条目“值 6”进来。键/值的插入将是 (6, “值 6”) 到 FACT_ATTRIBUTE。

这是我所在的地方:

INSERT INTO FACT_ATTRIBUTE (
        KEY, VALUE
    )
    VALUES(
    (SELECT (MAX(KEY) + 1) FROM FACT_ATTRIBUTE),
    (SELECT DISTINCT ENTRY
    FROM FACT fact_table
    WHERE NOT EXISTS ( 
        SELECT 1 FROM FACT_ATTRIBUTE fa
        WHERE fa.VALUE = fact_table.ENTRY
    ))
    );

问题很明显,内部select抓取多个元素,而insert是单值。一个限制是它不能在 null 上崩溃(如果没有新值)。有没有什么好方法可以做到这一点?我的 SQL 技能不是最敏锐的。提前感谢您的帮助!

【问题讨论】:

  • 对于初学者,您的查询似乎颠倒了,似乎您在值中输入了一个数值,在键中输入了一个字符串,而在您的描述中,您以相反的方式描述了表格(数字表示键,字符串表示值)。这是故意的还是查询中有错误?
  • 谢谢,把它们倒过来了,但查询仍然不起作用
  • 该评论不是为了解决您的问题,而是为了了解您的数据结构(阅读您的问题时并不清楚)。我已经发布了一个解决方案作为您问题的答案,看看是否对您有帮助。祝你好运。

标签: oracle merge sql-insert


【解决方案1】:

一种可能解决您的问题的方法是将您的插入语句从值转换为选择。试试这个 -

 INSERT INTO FACT_ATTRIBUTE (
        KEY, VALUE
    )
    SELECT max(key) over (partition by value) + 1 as key_max, f.entry
    FROM (
          SELECT f.entry, fa.value
          FROM fact_table f
          LEFT OUTER JOIN fact_attribute fa
          ON f.entry = fa.value)
    WHERE fa.value is null;

它可能需要一点语法润色,因为我没有服务器来检查它,但要点对我来说似乎是正确的 - 使用左外连接来查询 FACT_ATTRIBUTE 中不存在的所有条目并附加当前表中最大值+1。

【讨论】:

    【解决方案2】:

    这是让我得到所需的最终解决方案。

    DECLARE
    max_id  NUMBER;
    BEGIN
    
    --If no value, start with 1
    SELECT NVL(max(fa.FACT_ATTRIBUTE), 1) 
    INTO max_id
    FROM FACT_ATTRIBUTE fa;
    
    INSERT INTO FACT_ATTRIBUTE (KEY, VALUE)
    SELECT max_id + ROWNUM, DATA
    FROM (
        SELECT DISTINCT f.DATA
        FROM FACT f
        WHERE NOT EXISTS (
            SELECT 1 
            FROM FACT_ATTRIBUTE fa
            WHERE fa.VALUE = f.DATA
        ) 
        AND f.DATA IS NOT NULL
    );
    
    END;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-09
      • 2014-09-14
      • 1970-01-01
      • 1970-01-01
      • 2018-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多