0

我有这两张桌子。我要做的是找出职位编号、职位和申请总数。

 CREATE TABLE   POSITION (
posNum          varchar2(10)    not null,
posTitle        varchar2(70),
posOfferedBy        varchar2(70),
);

CREATE TABLE    APPLICATION (
appcnPosNum     varchar2(10)    not null
);

当我执行此操作时,它会显示所有职位的申请数量。即使是那些没有申请的职位,计数显示仍然会显示为1。请指导我。谢谢。我正在使用 oracle 数据库 11g

SELECT posNum, posTitle,count(*)
FROM position 
FULL OUTER JOIN application on position.posNum = application.appcnPosNum
GROUP BY posNum, posTitle;
4

1 回答 1

0
select * from application;
APPCNPOSNU
----------
1
2
25
1

select * from position;

POSNUM     POSTITLE   POSOFFERED
---------- ---------- ----------
1          title1     pos1
2          title2     pos2
1          title1     pos3
3          title3     pos4

完全外连接将从两个表中获取所有行 一个 distinct 应该没问题,除非您在应用程序表中有重复项并且如果您有没有职位的应用程序

SELECT posNum, posTitle,count(distinct application.appcnPosNum) ct
FROM position 
FULL OUTER JOIN application on position.posNum = application.appcnPosNum
GROUP BY posNum, posTitle;

POSNUM     POSTITLE           CT
---------- ---------- ----------
null       null                1
3          title3              0
1          title1              1
2          title2              1

我更喜欢做一个左连接,它检索所有位置(左表中的行)并用 null 替换所有在第二个中找不到的应用程序。一切都取决于这两个表之间的约束。

SELECT posNum, posTitle,count(appcnPosNum)
FROM position 
LEFT OUTER JOIN (select distinct appcnPosNum from application )app 
on position.posNum= app.appcnPosNum
GROUP BY posNum, posTitle;

POSNUM     POSTITLE   COUNT(APPCNPOSNUM)
---------- ---------- ------------------
3          title3                      0
1          title1                      2
2          title2                      1
于 2014-04-09T06:02:44.203 回答