使用相同的目标表从另一个表填充目标表

时间:2016-10-04 13:39:50

标签: sql oracle oracle11g

我有桌子A,还有其他几张额定桌子。 我想以阶段方式进行转换。 为了进行转换,我首先从表A(不是所有记录)创建一个临时表TMP。让我们说X.

CREATE TABLE TMP (EMP_ID NUMBER(9));

SELECT A.EMP_ID FROM A, TMP WHERE A.EMP_ID <>TMP.EMP_ID

但是select查询没有返回任何记录。我有100万条记录。有人能说出我在做什么错。

2 个答案:

答案 0 :(得分:1)

您正在使用几十年前使用的连接语法。您的表格之间的逗号转换为CROSS JOIN。你有

SELECT A.EMP_ID 
FROM A
CROSS JOIN TMP 
WHERE A.EMP_ID <> TMP.EMP_ID;

交叉连接将左表中的每个记录与右表中的每个记录组合在一起,以便获得所有组合。您的表TMP为空,因此您的结果集也为空。 (无论WHERE子句是什么。)

使用正确的ANSI连接,您可以将查询重写为

SELECT A.EMP_ID 
FROM A
INNER JOIN TMP ON A.EMP_ID <> TMP.EMP_ID;

完全相同(只是直接应用连接条件),当然结果仍然是空的。

你可能正在寻找的是:

select emp_id from a
where emp_id not in (select emp_id from tmp);

从T中获取所有尚未(尚未)的emp_id。

答案 1 :(得分:0)

您的查询未返回任何记录,因为tmp为空。当您执行cross join时,您获得的记录数是两个表中记录的乘积。如果一个记录为零,那么你将得到零记录。

所以,我只是建议:

insert into tmp (emp_id)
    select A.EMP_ID 
    from A;

如果你想在tmp不为空时这样做,那么你需要额外的逻辑来防止重复。