代码之家  ›  专栏  ›  技术社区  ›  Learn Hadoop

Oracle sql with regex-获取重复记录-

  •  2
  • Learn Hadoop  · 技术社区  · 7 年前

    这是我的表记录-表名是temp。

    1   | java,c,.net
    2   | oracle,hadoop,ruby
    

    实际上,我正在寻找这样的数据。

    1| java
    1 | c
    1 | .net
    2 | oracle
    2| hadoop
    2 | ruby
    

    我写了下面的查询,预期结果不匹配。你能检查一下我的问题吗?为什么它会导致,

    select id,
    regexp_substr(liked,'[^,]+', 1, level) from 
    temp connect by regexp_substr(liked,'[^,]+', 1, level) is not null order by id 
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   David Faber    7 年前

    您要执行以下操作:

     SELECT id, REGEXP_SUBSTR(liked, '[^,]+', 1, LEVEL)
       FROM temp 
    CONNECT BY REGEXP_SUBSTR(liked, '[^,]+', 1, LEVEL) IS NOT NULL
        AND PRIOR id = id
        AND PRIOR SYS_GUID() IS NOT NULL
      ORDER BY id;
    

    这种方式使用 DISTINCT 没有必要。

    编辑: CONNECT BY 子句,您将得到一个错误,因为Oracle将认为这是一个无限循环。

        2
  •  0
  •   Bob Jarvis - Слава Україні    7 年前

    要获得您想要的确切结果,您需要使用DISTINCT,并且需要在ID内按级别排序:

    SELECT ID, LIKED
      FROM (select DISTINCT id, level, regexp_substr(liked,'[^,]+', 1, level) as liked
              from temp
              connect by regexp_substr(liked,'[^,]+', 1, level) is not null
              order by id, level);
    

    SQLFiddle here

    祝你好运。