Oracle SQL Union / Merge with Duplicates问题

时间:2016-09-06 19:07:21

标签: oracle plsql oracle11g user-defined-functions

希望有人可以帮助我。

所以假设我有一个名为“TEMP_TABLE”的临时表

 EMP_ID     number
 EMP_FNAME  varchar2()
 EMP_LNAME  varchar2()

“TEMP_TABLE”中的记录

1, Some, Guy
2, Some, Girl
3, Some, Animal

通过一些SQL魔术,我不打算深入研究,计算这些值并将其放入TEMP_TABLE,即函数返回的select * from TEMP_TABLE的多重集

假设函数是FUNC_THAT_RETURNS_TABLE

好的,如果我说Select * from table("FUNC_THAT_RETURNS_TABLE");

我回来了:

  1, Some, Guy
  2, Some, Girl
  3, Some, Animal

到目前为止一切顺利。

现在我创建另一个名为"NEWLY_CREATED_TABLE"

的表

说:

 Create Table "NEWLY_CREATED_TABLE" AS
 (Select * FROM table("FUNC_THAT_RETURNS_TABLE")); 

请注意,该表是通过查询函数

创建的

所以这三条记录现在应该在NEWLY_CREATED_TABLE

之内

问题在于此 如果我说:

Select * FROM NEWLY_CREATED_TABLE
Union
SELECT * FROM table("FUNC_THAT_RETURNS_TABLE");

结果集是:

 1, Some, Guy
 1, Some, Guy
 2, Some, Girl
 2, Some, Girl
 3, Some, Animal
 3, Some, Animal

即使数据完全相同,有人可以告诉我我缺少的东西吗?

在测试使用合并的可能性时,我发现了联合问题。 当我尝试将表中的数据与函数中的数据合并时,表中的所有数据都将被替换。这让我认为代码没有正确识别唯一记录。

我的合并代码:

 Merge Into Newly_Created_Table a
 using
 (
   Select * from table(Func_That_Returns_TABLE)
 ) b
On (a.EMP_ID = b.EMP_ID)

When Matched....

When Not Matched....

**编辑** 9-7-2016 SHOUTOUT TO @Shannon Severance其中一个列中有一个空白区域。

除了在插入之前尝试修剪插入,截断或使用触发器以修剪:NEW值之外,是否有任何方法,以确保不会在没有明显原因的情况下添加尾随空格?

1 个答案:

答案 0 :(得分:1)

我为您找到了解决方案。我运行了它,没有得到任何错误。

CREATE TABLE temp_table
(
 EMP_ID     NUMBER,
 EMP_FNAME  varchar2(32),
 EMP_LNAME  varchar2(32)
);

INSERT INTO temp_table values (1, 'SOME','Guy');
INSERT INTO temp_table values (2, 'SOME','Girl');
INSERT INTO temp_table values (3, 'SOME','Animal');

CREATE OR REPLACE TYPE three_values_ot AS OBJECT
   (
 EMP_ID     NUMBER,
 EMP_FNAME  varchar2(32),
 EMP_LNAME  varchar2(32)
   );


CREATE OR REPLACE TYPE three_values_nt
   IS TABLE OF three_values_ot;

CREATE OR REPLACE FUNCTION FUNC_THAT_RETURNS_TABLE
   RETURN three_values_nt
IS
   l_return three_values_nt := 
      three_values_nt (three_values_ot (1, 'SOME','Guy'),
                       three_values_ot (2, 'SOME','Girl'),
                       three_values_ot (3, 'SOME','Animal'));
BEGIN
   RETURN l_return;
END;

SELECT * FROM temp_table
UNION
SELECT * FROM TABLE (FUNC_THAT_RETURNS_TABLE ());

上述联合查询的输出为

1   SOME    Guy
2   SOME    Girl
3   SOME    Animal