An insert
statement would be used if the APPLICANT
table is empty.
An update
statement if all the ANUMBER
is in the APPLICANT
.
The most general is a merge
statement, which does both.
Since the APPLICANT
table already existed, I assume it isn't empty.
Therefore, I will give an example with a merge
.
See this page: Oracle SQL: Update a table with data from another table
This is the basic underlying query:
select anumber,
count(anumber) numapp
from applies
group by anumber
union
select anumber,0 numapp
from applicant
where
anumber not in (select anumber from applies)
order by 1
;
It can be simpler for an insert
and an update
.
It shows the resulting data.
The null values don't arise for me.
When incorporated into a merge:
merge into applicant a
using (
select anumber,
count(anumber) numapp
from applies
group by anumber
union
select anumber,0 numapp
from applicant
where
anumber not in (select anumber from applies)
) b
on (a.anumber = b.anumber)
when matched then
update set a.numapp = b.numapp
when not matched then
insert (a.anumber,a.numapp)
values (b.anumber,b.numapp);
select * from applicant order by anumber;
commit;
Result:
ANUMBER |
NUMAPP |
1 |
3 |
2 |
1 |
3 |
0 |
4 |
0 |
5 |
1 |
My testing DDL:
CREATE TABLE APPLICANT
("ANUMBER" int, "NUMAPP" varchar2(4))
;
INSERT ALL
INTO APPLICANT ("ANUMBER", "NUMAPP")
VALUES (1, NULL)
INTO APPLICANT ("ANUMBER", "NUMAPP")
VALUES (2, NULL)
INTO APPLICANT ("ANUMBER", "NUMAPP")
VALUES (3, NULL)
INTO APPLICANT ("ANUMBER", "NUMAPP")
VALUES (4, NULL)
SELECT * FROM dual
;
CREATE TABLE APPLIES
("ANUMBER" int)
;
INSERT ALL
INTO APPLIES ("ANUMBER")
VALUES (1)
INTO APPLIES ("ANUMBER")
VALUES (1)
INTO APPLIES ("ANUMBER")
VALUES (1)
INTO APPLIES ("ANUMBER")
VALUES (2)
INTO APPLIES ("ANUMBER")
VALUES (5)
SELECT * FROM dual
;
Edit1:
When creating a merge
, I assumed that the update
would be just a slight variation.
About an insert
I still think so. :-)
I was unable to make an updateable select
in this case.
Probably because of a group
clause.
So I used the aggregation using the nested where
criterion t.anumber=s.anumber
.
You probably assume the data in a database look like tables.
The data in the DB is trees/hash spaces/clusters. Tables forms during a presentation.
All rows/records have to be connected using a joining criterion.
You can find a better explanation in the link above.
SQL:
ALTER TABLE APPLICANT
ADD NUMAPP NUMBER(2);
update applicant t set
t.numapp = (
select count(s.anumber)
from applies s where t.anumber=s.anumber
)
;
select * from applicant order by anumber;
commit;
Output:
ANUMBER |
NUMAPP |
1 |
3 |
2 |
1 |
3 |
0 |
4 |
0 |
DDL:
CREATE TABLE APPLICANT
("ANUMBER" int)
;
INSERT ALL
INTO APPLICANT ("ANUMBER")
VALUES (1)
INTO APPLICANT ("ANUMBER")
VALUES (2)
INTO APPLICANT ("ANUMBER")
VALUES (3)
INTO APPLICANT ("ANUMBER")
VALUES (4)
SELECT * FROM dual
;
CREATE TABLE APPLIES
("ANUMBER" int)
;
INSERT ALL
INTO APPLIES ("ANUMBER")
VALUES (1)
INTO APPLIES ("ANUMBER")
VALUES (1)
INTO APPLIES ("ANUMBER")
VALUES (1)
INTO APPLIES ("ANUMBER")
VALUES (2)
SELECT * FROM dual
;