业务表和数据字典表关联(可以为null)

willishz 2012-08-22 12:10:40
我有一个业务表和数据字典表,表结构和数据如下:
业务表里的字段关联数据字典项但是可以为null,怎么写一个sql能将两个表关联起来并显示所有数据字典的中文内容?(为null的字段显示为'')
最好不要太复杂,因为实际的业务表里面有7,8个字段关联着数据字典表且都可以为null

create table tmp_dic (
dicid number primary key,
KIND VARCHAR2(20),
NAME VARCHAR2(20),
CODE VARCHAR2(20),
DETAIL VARCHAR2(20)
);

CREATE TABLE TMP_STOCK_ORDER_HEADER(
STOCK_ORDER_HEADER_ID NUMBER primary key,
STOCK_ORDER_NUMBER VARCHAR2(200),
STOCK_ORDER_TYPE VARCHAR2(50),
ORDER_STATUS VARCHAR2(50),
URGENCY_LEVEL VARCHAR2(200)
)
;

insert into TMP_DIC (DICID, KIND, NAME, CODE, DETAIL) values ('1', 'ORDER_STATUS', '单据状态', 'DRAFT', '草稿');
insert into TMP_DIC (DICID, KIND, NAME, CODE, DETAIL) values ('2', 'ORDER_STATUS', '单据状态', 'FAILED', '更新库存失败');
insert into TMP_DIC (DICID, KIND, NAME, CODE, DETAIL) values ('3', 'ORDER_STATUS', '单据状态', 'INPROCESS', '更新库存中');
insert into TMP_DIC (DICID, KIND, NAME, CODE, DETAIL) values ('4', 'ORDER_STATUS', '单据状态', 'PARTIAL_SUCCESS', '更新部分库存成功');
insert into TMP_DIC (DICID, KIND, NAME, CODE, DETAIL) values ('5', 'ORDER_STATUS', '单据状态', 'SUCCESS', '更新库存成功');
insert into TMP_DIC (DICID, KIND, NAME, CODE, DETAIL) values ('6', 'ORDER_STATUS', '单据状态', 'WAITING', '已下单待入库');
insert into TMP_DIC (DICID, KIND, NAME, CODE, DETAIL) values ('13', 'STOCK_ORDER_TYPE', '出入库类型', 'DISCARD', '报废');
insert into TMP_DIC (DICID, KIND, NAME, CODE, DETAIL) values ('14', 'STOCK_ORDER_TYPE', '出入库类型', 'REPAIR', '返修');
insert into TMP_DIC (DICID, KIND, NAME, CODE, DETAIL) values ('15', 'STOCK_ORDER_TYPE', '出入库类型', 'RETURN', '退库');
insert into TMP_DIC (DICID, KIND, NAME, CODE, DETAIL) values ('16', 'STOCK_ORDER_TYPE', '出入库类型', 'STOCKIN', '入库');
insert into TMP_DIC (DICID, KIND, NAME, CODE, DETAIL) values ('17', 'STOCK_ORDER_TYPE', '出入库类型', 'STOCKOUT', '出库');
insert into TMP_DIC (DICID, KIND, NAME, CODE, DETAIL) values ('18', 'URGENCY_LEVEL', '紧急程度', '1', '平急');
insert into TMP_DIC (DICID, KIND, NAME, CODE, DETAIL) values ('19', 'URGENCY_LEVEL', '紧急程度', '2', '加急');
insert into TMP_DIC (DICID, KIND, NAME, CODE, DETAIL) values ('20', 'URGENCY_LEVEL', '紧急程度', '3', '特急');
insert into TMP_DIC (DICID, KIND, NAME, CODE, DETAIL) values ('21', 'URGENCY_LEVEL', '紧急程度', '4', '特提');

insert into TMP_STOCK_ORDER_HEADER (STOCK_ORDER_HEADER_ID, STOCK_ORDER_NUMBER, STOCK_ORDER_TYPE, ORDER_STATUS, URGENCY_LEVEL) values ('1', 'N123', 'STOCKIN', 'DRAFT', '1');
insert into TMP_STOCK_ORDER_HEADER (STOCK_ORDER_HEADER_ID, STOCK_ORDER_NUMBER, STOCK_ORDER_TYPE, ORDER_STATUS, URGENCY_LEVEL) values ('2', 'N234', 'STOCKOUT', null, null);
insert into TMP_STOCK_ORDER_HEADER (STOCK_ORDER_HEADER_ID, STOCK_ORDER_NUMBER, STOCK_ORDER_TYPE, ORDER_STATUS, URGENCY_LEVEL) values ('3', 'N345', null, null, null);

两个表关联类似这种样子,但因为业务表里允许有null值,所以这个sql是错的查不出数据.
select
STOCK_ORDER_HEADER_ID,
STOCK_ORDER_NUMBER,
d_.DETAIL as STOCK_ORDER_TYPE,
d_.DETAIL as ORDER_STATUS,
d_.DETAIL as URGENCY_LEVEL
from
TMP_STOCK_ORDER_HEADER,
tmp_dic d_
where 0=0
AND d_.KIND = 'STOCK_ORDER_TYPE' AND d_.CODE = STOCK_ORDER_TYPE
AND d_.KIND = 'ORDER_STATUS' AND d_.CODE = ORDER_STATUS
AND d_.KIND = 'URGENCY_LEVEL' AND d_.CODE = URGENCY_LEVEL
;
...全文
488 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
willishz 2012-08-22
  • 打赏
  • 举报
回复
哦!谢谢啦!这个不是多对多,呵呵,给分!
Sue 2012-08-22
  • 打赏
  • 举报
回复
表结构设计的不好,多对多的关系最好是有张中间表。
Sue 2012-08-22
  • 打赏
  • 举报
回复
select
STOCK_ORDER_HEADER_ID,
STOCK_ORDER_NUMBER,
(SELECT DETAIL FROM TMP_DIC WHERE KIND='STOCK_ORDER_TYPE' AND CODE=S.STOCK_ORDER_TYPE) AS STOCK_ORDER_TYPE,
(SELECT DETAIL FROM TMP_DIC WHERE KIND='ORDER_STATUS' AND CODE=S.ORDER_STATUS) AS ORDER_STATUS,
(SELECT DETAIL FROM TMP_DIC WHERE KIND='URGENCY_LEVEL' AND CODE=S.URGENCY_LEVEL) AS URGENCY_LEVEL
from
TMP_STOCK_ORDER_HEADER S;
有多种方式的,给出一种。
Sue 2012-08-22
  • 打赏
  • 举报
回复
有很多中方式的,我给一种
select
STOCK_ORDER_HEADER_ID,
STOCK_ORDER_NUMBER,
(SELECT DETAIL FROM TMP_DIC WHERE KIND='STOCK_ORDER_TYPE' AND CODE=S.STOCK_ORDER_TYPE) AS STOCK_ORDER_TYPE,
(SELECT DETAIL FROM TMP_DIC WHERE KIND='ORDER_STATUS' AND CODE=S.ORDER_STATUS) AS ORDER_STATUS,
(SELECT DETAIL FROM TMP_DIC WHERE KIND='URGENCY_LEVEL' AND CODE=S.URGENCY_LEVEL) AS URGENCY_LEVEL
from
TMP_STOCK_ORDER_HEADER S;
一点建议:楼主的数据表结构设计有点乱,数据存储冗余。
ORAClE SE 2012-08-22
  • 打赏
  • 举报
回复
SELECT Stock_Order_Header_Id,
Stock_Order_Number,
d_.Detail AS Stock_Order_Type,
d_.Detail AS Order_Status,
d_.Detail AS Urgency_Level
FROM Tmp_Stock_Order_Header a, Tmp_Dic d_
WHERE 0 = 0
AND d_.Kind = 'STOCK_ORDER_TYPE'
AND d_.Code = a.Stock_Order_Type

UNION ALL
SELECT Stock_Order_Header_Id,
Stock_Order_Number,
d_.Detail AS Stock_Order_Type,
d_.Detail AS Order_Status,
d_.Detail AS Urgency_Level
FROM Tmp_Stock_Order_Header a, Tmp_Dic d_
WHERE 0 = 0

AND d_.Kind = 'ORDER_STATUS'
AND d_.Code = a.Order_Status

UNION ALL
SELECT Stock_Order_Header_Id,
Stock_Order_Number,
d_.Detail AS Stock_Order_Type,
d_.Detail AS Order_Status,
d_.Detail AS Urgency_Level
FROM Tmp_Stock_Order_Header a, Tmp_Dic d_
WHERE 0 = 0

AND d_.Kind = 'URGENCY_LEVEL'
AND d_.Code = a.Urgency_Level
willishz 2012-08-22
  • 打赏
  • 举报
回复
就是结果为
STOCK_ORDER_HEADER_ID STOCK_ORDER_NUMBER STOCK_ORDER_TYPE ORDER_STATUS URGENCY_LEVEL
1 N123 入库 草稿 平急
2 N234 出库 '' ''
3 N345 '' '' ''
willishz 2012-08-22
  • 打赏
  • 举报
回复
结果为
STOCK_ORDER_HEADER_ID STOCK_ORDER_NUMBER STOCK_ORDER_TYPE ORDER_STATUS URGENCY_LEVEL
1 N123 入库 '' ''
2 N234 出库 '' ''
3 N345 '' '' ''
willishz 2012-08-22
  • 打赏
  • 举报
回复
就是结果为
STOCK_ORDER_HEADER_ID STOCK_ORDER_NUMBER STOCK_ORDER_TYPE ORDER_STATUS URGENCY_LEVEL
1 N123 入库 草稿 平急
2 N234 出库 '' ''
3 N345 '' '' ''
ershihaidao 2012-08-22
  • 打赏
  • 举报
回复
不知道什么意思!在说明白一点。或者最终需要得到什么结果

17,090

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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