我有桌子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万条记录。有人能说出我在做什么错。
答案 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
不为空时这样做,那么你需要额外的逻辑来防止重复。