我是数据库编程的新手。我有一个关于主 - 细节结构的问题,并使用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
请帮助我解决这个问题
感谢
答案 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;
现在这样可以正常工作。