主要细节ORACLE数据库中的IF条件

时间:2014-12-01 08:04:40

标签: sql oracle

我是数据库编程的新手。我有一个关于主 - 细节结构的问题,并使用IF语句进行操作。

所以我有主表,

MASTER,
ID   
NOTE1
NOTE2

DETAIL,
ID     ITEM   STATUS
NOTE1  BOOKA   DELIVERED
NOTE1  BOOKB   NOTDELIVERED
NOTE2  BOOKA   DELIVERED
NOTE2  BOOKC   DELIVERED

所以我在查询中有这样的逻辑,如果详细的所有项目的状态都是DELIVERED,那么当用户从MASTER查询note1时,它必须打印DELIVERED。否则,如果没有交付所有物品,则必须打印NOTDELIVERED。

SELECT M.ID, (IF-Condition to check all the items in details D) FROM MASTER M JOIN DETAIL.D ON M.ID = D.ID

请帮助我解决这个问题

感谢

2 个答案:

答案 0 :(得分:0)

根据数据量(主记录数量,详细记录数量),DELIVERED和NOTDELIVERED的分布可能会有不同的做法,但我可能会这样做:

SELECT m.ID
, CASE WHEN NVL(NOTDELIVERED_COUNT,0) = 0 THEN 'DELIVERED' ELSE 'NOTDELIVERED' END AS DELIVERED
FROM MASTER m
LEFT JOIN (
    SELECT ID
    , COUNT(*) NOTDELIVERED_COUNT
    FROM DETAIL
    WHERE STATUS = 'NOTDELIVERED'
    GROUP BY ID
) d ON d.ID = m.ID

因此,让子查询将ID与未传递的项目结合在一起,并检查是否已加入主服务器(LEFT JOIN,以便没有NOTDELIVERED项目的ID通过NULL传递)

答案 1 :(得分:-1)

这是根据您给定的数据的解决方案,我没有使用主表,因为如果它的标题和细节关系,那么外键约束必须在那里。

SELECT DISTINCT DT.ID,
CASE WHEN TOT=1 AND STATUS='DELIVERED' THEN 'DELIVERED' ELSE 'UNDELIVERED' END STAT
FROM
   (
    SELECT ID,COUNT(1) TOT
    FROM (
           select de.id,wm_concat(de.ITEM),status from  detail de
            group by id,status
         ) GROUP BY ID
   ) DH,DETAIL DT,MASTERD MA
WHERE DT.ID=DH.ID
 AND DT.ID=MA.ID;

或者你可以使用这个

select distinct ma.id,
    (
    case when count(1) in (select count(d.id) from detail d where d.id=de.id ) 
    and de.status='DELIVERED' then 'DELIVERED' 
    else 'UNDELIVERED'   end
    ) status 
from masterd ma,detail de
where ma.id=de.id
group by ma.id,de.status,de.id 
order by 1;

现在这样可以正常工作。