SQL> select * from a; ID A_1 ---------- ---------- 1 10 2 30 3 30SQL> select * from b; ID ---------- 1SQL> select * from c;no rows selectedSQL> insert into c (id) select a.id from a,b where a.id=b.id(+) and b.id is null;2 rows created.SQL> commit;Commit complete.SQL> select * from c; ID ---------- 2 3如果数据量不大,可以这样更新 SQL> update a set a_1=a_1+1 where rowid in(select a.rowid from a,b where a.id=b.id(+) and b.id is null);2 rows updated.SQL> commit;Commit complete.SQL> select * from a; ID A_1 ---------- ---------- 1 10 2 31 3 31
insert c select * from t1 minus select * from t2;update t1 X set t1.A_1=T1.A_1+1 WHERE EXISTS (SELECT 1 FROM (SELECT * FROM T1 MINUS SELECT * FROM T2 ) Y WHERE X.A_1=Y.A_1 ) 呵呵,没测试过,你试试看应该没错的.
很感谢ATGC和学习奋斗的答复, 但 1, select a.id from a,b where a.id=b.id(+) and b.id is null 会把a表和b表相同的数据,也查询出来,我要的是a表和b表的差异数据,也就是a表中有的数据,而b表中没有。 2, a表和b表,我统计了一下,分别都是具有百万数据的表。 3, 学习奋斗的SQL运行不了哦。
1.select a.id from a,b where a.id=b.id(+) and b.id is null 肯定只查出A表有的,而B表没的记录,而不是像你说都的“会把a表和b表相同的数据,也查询出来”
不错,是包含了A表和B表相同的数据,但是也列出了A表有而B表没有的数据对吧? 当A表有的数据,而B表没有时,那么显示的是NULL值,因此,只要加一个条件,B.ID IS NULL就能选出A表有,而B表没有的数据了 我说你没有仔细看我贴出来的SQL. 这个你无需怀疑,概念非常清楚的SQL> select * from a; ID ---------- 1 2 3Elapsed: 00:00:00.00 SQL> select * from b; ID ---------- 1Elapsed: 00:00:00.00 SQL> select a.id,b.id from a,b where a.id=b.id(+); ID ID ---------- ---------- 1 1 2 3Elapsed: 00:00:00.00 SQL> select a.id,b.id from a,b where a.id=b.id(+) and b.id is null; ID ID ---------- ---------- 2 3Elapsed: 00:00:00.00 SQL>
1,select a.id,b.id from a,b where a.id=b.id(+) and b.id is null; 2,select a.id from a where a.id not in (select b.id from b); 我在PL/SQL里使用执行计划,显示耗费都是一样(id都有索引),因为a表和b表都是有百万数据的表,请问有优化的方法吗?
---------- ----------
1 10
2 30
3 30SQL> select * from b; ID
----------
1SQL> select * from c;no rows selectedSQL> insert into c (id) select a.id from a,b where a.id=b.id(+) and b.id is null;2 rows created.SQL> commit;Commit complete.SQL> select * from c; ID
----------
2
3如果数据量不大,可以这样更新
SQL> update a set a_1=a_1+1 where rowid in(select a.rowid from a,b where a.id=b.id(+) and b.id is null);2 rows updated.SQL> commit;Commit complete.SQL> select * from a; ID A_1
---------- ----------
1 10
2 31
3 31
select * from t1
minus
select * from t2;update t1 X
set t1.A_1=T1.A_1+1
WHERE EXISTS
(SELECT 1 FROM (SELECT * FROM T1 MINUS SELECT * FROM T2 ) Y
WHERE X.A_1=Y.A_1
)
呵呵,没测试过,你试试看应该没错的.
但
1, select a.id from a,b where a.id=b.id(+) and b.id is null 会把a表和b表相同的数据,也查询出来,我要的是a表和b表的差异数据,也就是a表中有的数据,而b表中没有。
2, a表和b表,我统计了一下,分别都是具有百万数据的表。
3, 学习奋斗的SQL运行不了哦。
肯定只查出A表有的,而B表没的记录,而不是像你说都的“会把a表和b表相同的数据,也查询出来”
你可以把b表里,填充些数据,你再试试。
当A表有的数据,而B表没有时,那么显示的是NULL值,因此,只要加一个条件,B.ID IS NULL就能选出A表有,而B表没有的数据了
我说你没有仔细看我贴出来的SQL.
这个你无需怀疑,概念非常清楚的SQL> select * from a; ID
----------
1
2
3Elapsed: 00:00:00.00
SQL> select * from b; ID
----------
1Elapsed: 00:00:00.00
SQL> select a.id,b.id from a,b where a.id=b.id(+); ID ID
---------- ----------
1 1
2
3Elapsed: 00:00:00.00
SQL> select a.id,b.id from a,b where a.id=b.id(+) and b.id is null; ID ID
---------- ----------
2
3Elapsed: 00:00:00.00
SQL>
2,select a.id from a where a.id not in (select b.id from b);
我在PL/SQL里使用执行计划,显示耗费都是一样(id都有索引),因为a表和b表都是有百万数据的表,请问有优化的方法吗?
所谓 "优化" 是相对的
没有绝对的好,也没有绝对的不好
同样的SQL,由于环境,数据量等的变化,本来执行得好好的SQL也会很慢
update a
set A_1=A_1+1
where 条件;
觉得可能要对表c有限制的,应该和表a的结构相同才可以的。