从PL / SQL中的多列中删除关联数组中的重复项

时间:2015-10-23 13:57:43

标签: arrays oracle

我已经看到了几个使用MULTISET UNION DISTINCTSET删除Oracle关联数组中重复项的很好的例子。当只有一列时它很有用。 我有一个基于RECORD类型的关联数组,其中包含3列。 是否可以使用上述方法?

DECLARE
  TYPE rec_type IS RECORD(
     column1 VARCHAR2(5)
    ,column2 VARCHAR2(5));
  TYPE my_aa IS TABLE OF rec_type;
  p_tbl my_aa := my_aa();
  q_tbl my_aa := my_aa();
BEGIN
  p_tbl.extend(4);
  p_tbl(1).column1 := 'A1';
  p_tbl(1).column2 := 'a';
  --
  p_tbl(2).column1 := 'A1';
  p_tbl(2).column2 := 'b';
  --
  p_tbl(3).column1 := 'A1'; -- Dup 
  p_tbl(3).column2 := 'a'; -- Dup
  --
  p_tbl(4).column1 := 'A1';
  p_tbl(4).column2 := 'c';
  --
  dbms_output.put_line('-- First output contains duplicated');
  --
  FOR a IN p_tbl.first .. p_tbl.last LOOP
    dbms_output.put_line(a || ' = ' || p_tbl(a).column1 || ' / ' || p_tbl(a).column2);
  END LOOP;
  --
  --
  q_tbl := p_tbl MULTISET UNION DISTINCT p_tbl;
  --
  --
  dbms_output.new_line;
  dbms_output.put_line('-- Duplicates have been removad');
  FOR a IN q_tbl.first .. q_tbl.last LOOP
    dbms_output.put_line(a || ' = ' || q_tbl(a).column1|| ' / '||q_tbl(a).column2);
  END LOOP;
END;

1 个答案:

答案 0 :(得分:1)

由于文档

,无法区分MULTISET UNION DISTINCT基础RECORD类型
  

嵌套表的元素类型必须具有可比性。请   有关可比性的信息,请参阅“比较条件”   非标量类型。   https://docs.oracle.com/cd/B12037_01/server.101/b10759/operators006.htm

记录无法比较。您可以将具有MAP方法的用户定义对象用于此

  

如果它们是相同的,则两个非标量类型的对象是可比较的   命名类型和他们之间有一对一的对应关系   元素。此外,用户定义的对象类型的嵌套表,   即使它们的元素具有可比性,也必须定义MAP方法   在他们身上用于平等或IN条件。   https://docs.oracle.com/cd/B12037_01/server.101/b10759/conditions002.htm#i1033286

如果您仍然使用记录执行此操作,请尝试使用SELECT DISTINCT ... FROM TABLE()方法,但必须在架构级别上为oracle 12c之前的服务器定义类型。