一个视图问题

zls0303 2002-08-08 12:01:45
我在写一个视图,所用数据库为oralce表如下:
create table per_swap
(
Swap_id varchar(10) not null, /* 编号 */
Emp_id varchar(10) not null, /* 员工编号 */
Out_depid varchar(8) null, /* 调出部门名称 */
Lpost_name varchar(12) null, /* 调出前工作岗位 */
Enter_depid varchar(8) null, /* 调进部门名称 */
Npost_name varchar(12) null, /* 调进工作岗位 */
swap_type char(1) null, /* 出入类型 */
Out_sign varchar(8) null, /* 调出部门领导签字 */
Enter_sign varchar(8) null, /* 调入部门领导签字 */
If_confirm char(1) null, /* 是否批准 */
Swap_date date null, /* 时间 */
Remark varchar(80) null, /* 备注*/
constraint pk_per_swap primary key(Swap_id)
);

这里面有一个调出部门后一个调进部门,
视图代码如下:
 CREATE VIEW v_per_swap AS
SELECT A.swap_id,A.emp_id,B.emp_name,A.out_depid,C.dep_name,
A.lpost_name,A.enter_depid,A.npost_name,
DECODE(A.swap_type,'1','调入','调出') swap_type,
A.out_sign,A.enter_sign,
DECODE(A.if_confirm ,'1','批准','未批准') if_confirm,
to_char(A.swap_date,'YYYY-MM-DD') swap_date,A.remark
FROM per_swap A,per_employee B,per_department C
WHERE A.emp_id=B.emp_id(+) and A.out_depid=C.dep_id(+)
and A.enter_depid=C.dep_id(+);
 如果这样写出来的话,那emp_name在视图里就不显示,如果去掉下面的and A.enter_depid=C.dep_id(+),就只能显示出调出部门的汉字,调进部门不能显示
  
 如何解决啊!!!!

...全文
93 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
CHENGXB 2002-08-08
  • 打赏
  • 举报
回复
1、我觉得没必要用外部关联,因为per_swap 中的emp_id、out_depid、enter_depid都应在per_employee(姓名、ID对照)和 per_department (部门名称、编号对照中有),它们应是per_swap 的外键。
2、emp_name如果不能显示,可能是因为per_employee 中没有符合A.emp_id=B.emp_id条件的记录。
3、你要显示两个不同的部门名称,应当对per_department 关联两次,如:
SELECT A.swap_id,A.emp_id,B.emp_name,A.out_depid,C.dep_name OUT_DEP_NAME,
A.enter_depid,D.dep_name ENTER_DEP_NAME
FROM per_swap A,per_employee B,per_department C,per_department D
WHERE A.emp_id=B.emp_id and A.out_depid=C.dep_id
and A.enter_depid=D.dep_id;
weimenren 2002-08-08
  • 打赏
  • 举报
回复
create view v_per_swap as

select information(from per_swap,per_wmployee,per_department)
from per_swap A,per_employee B,per_department C
WHERE A.emp_id=B.emp_id(+) and A.out_depid=C.dep_id(+)

union

select information(from per_swap,per_wmployee,per_department)
from per_swap A,per_employee B,per_department C
WHERE A.emp_id=B.emp_id(+) and and A.enter_depid=C.dep_id(+);
mycode 2002-08-08
  • 打赏
  • 举报
回复
犯一个简单错误,调入和调出部门,应该分别对一个别名表。
修改后视图如下:
CREATE VIEW v_per_swap AS
SELECT A.swap_id,A.emp_id,B.emp_name,A.out_depid,C.dep_name,D.dep_name,
A.lpost_name,A.enter_depid,A.npost_name,
DECODE(A.swap_type,'1','调入','调出') swap_type,
A.out_sign,A.enter_sign,
DECODE(A.if_confirm ,'1','批准','未批准') if_confirm,
to_char(A.swap_date,'YYYY-MM-DD') swap_date,A.remark
FROM per_swap A,per_employee B,per_department C, per_department D
WHERE A.emp_id=B.emp_id(+)
and A.enter_depid=C.dep_id(+)
and A.out_depid=D.dep_id(+);

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧