Sql 主详细信息ORACLE数据库中的IF条件

Sql 主详细信息ORACLE数据库中的IF条件,sql,oracle,Sql,Oracle,我是数据库编程的新手。我有一个关于主细节结构和操作使用IF语句的问题 所以我有主桌 MASTER, ID NOTE1 NOTE2 DETAIL, ID ITEM STATUS NOTE1 BOOKA DELIVERED NOTE1 BOOKB NOTDELIVERED NOTE2 BOOKA DELIVERED NOTE2 BOOKC DELIVERED 因此,我在查询中有这样一种逻辑,即如果所有详细项目的状态都已交付,那么当用户从MASTER查询n

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

所以我有主桌

MASTER,
ID   
NOTE1
NOTE2

DETAIL,
ID     ITEM   STATUS
NOTE1  BOOKA   DELIVERED
NOTE1  BOOKB   NOTDELIVERED
NOTE2  BOOKA   DELIVERED
NOTE2  BOOKC   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
请帮助我如何处理这个问题


谢谢

根据数据量的不同,主记录的数量、详细记录的数量、已交付和未交付记录的分布情况可能会有所不同,但我可能会:

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汇集在一起,并检查是否存在连接到主左连接的ID,以便没有未交付项的ID以NULL形式通过这里是根据给定数据的解决方案,我没有使用主表,因为如果它是标头和详细信息关系,则为外键约束必须存在

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;

现在这样就行了。

不是正好相反吗?如果未送达计数>0,则打印未送达?这是错误的方法-谢谢@X.L.Ant!-现在修复:-@船长我还有一个问题,如果我想添加第三个案例PARTIALLYDELIVERED when NOTDELIVERED\u COUNT>0且DELIVERED\u COUNT>=1???嗨,这将使了解您的数据和查询变得有点重要-在我的第一次查询中,我假设有一小部分大数据未交付。。。如果我们以相同的方式包含一个已传递的_计数,那么我们的性能可能会比执行相关子查询时更差。。。您将如何真正查询这些数据?ewe在谈论多少数据?您的第一个查询将忽略没有任何关联详细信息行的主数据行。您的第二个查询打印了一个主记录的错误结果,该主记录只有一个详细记录,状态为“已交付”。@FrankSchmitt,不,不是这样,根据给定的数据,我的查询在这两种情况下都返回了正确的结果,因为我实际上是这样做的,然后只有我发布了它。。。我还提到了我没有使用master的情况下的引用完整性。您的查询恰好适用于提供的示例数据,但第二个查询中的WHEN COUNT1>1显然是错误的。尝试添加第三个主数据,其中包含一个详细信息和已交付的状态,并检查发生了什么。是的,您是正确的@FrankSchmitt,所以现在我编辑了查询并使其正确,请检查。。。谢谢你纠正我的错误,甚至我也加入了师父的第一个。