将 ORACLE 查询上的 WHERE 条件优化为登台表

Refine a WHERE condition on ORACLE query to staging tables

我正在寻求一些帮助,以将 SQL 查询的 WHERE 条件改进为一组链接的 Oracle 数据分段 table。

一个table用于案例数据,包含有关记录的元数据。 table 每个案例只有一个记录。这个 table 上有一个标志列,一旦数据被读取并发送到另一个数据库,就会将案例数据标记为 Processed。 case_staging_table

CASE_NUMBER CASE_DETAILS PARENT_ID_NUMBER PROCESSED_FLAG
0001        First Case   X0001            NULL
0002        Second Case  X0002            NULL
0003        Third Case   X0003            Processed

第二个 table 用于附件数据,包含有关链接到案例数据的文件附件的元数据。关于此 table,每个案例可能有多个记录。此 table 上有一个标志列,如果生成的文件传输到服务器,则将附件标记为已发送。 attachment_staging_table

ID_NUMBER PARENT_ID_NUMBER ATTACHMENT_NAME               ATTACHMENT_SENT_FLAG
A0001     X0001            First Case Attachment 1.docx  N
A0002     X0001            First Case Attachment 2.docx  N
A0003     X0001            First Case Attachment 3.docx  Y
A0004     X0003            Third Case Attachment.docx    Y

我需要做的是在查询中构建一个 WHERE 条件,我只提取案例尚未处理的案例记录,并且所有附件记录都包含 YATTACHMENT_SENT_FLAG 列中的 NULL(如果个案记录不包含附件,则会出现 NULL)。如果附件暂存 table 中的任何一条相关记录在 ATTACHMENT_SENT_FLAG 列中有一个 N,我不希望该案例记录出现在查询结果中。

在这种情况下:

此阶段的查询结果应仅包括案例编号 0002,因为它尚未处理且无需等待任何附件。查询结果不应包含案例编号 0001,因为其中两个附件尚未准备好,并且不应包含案例编号 0003,因为它已被处理。

我当前的查询有以下 WHERE 条件:

SELECT 
    case.staging_table.CASE_NUMBER,
    case_staging_table.CASE_DETAILS,
    attachment_staging_table.ATTACHMENT_NAME
FROM
    case_staging_table
    LEFT JOIN attachment_staging_table 
        ON case_staging_table.PARENT-ID = attachment_staging_table.PARENT_ID
WHERE 
    case_staging_table.PROCESSED_FLAG IS NULL
    AND (
        attachment_staging_table.ATTACHMENT_SENT_FLAG = ‘Y’
        OR attachment_staging_table.ATTACHMENT_SENT_FLAG IS NULL
    )

然而,此 WHERE 条件仍将处理案例编号 0001,并在它到达发送到服务器的第三个附件后立即将其标记为已处理。

预先感谢您的帮助!

过滤 attachment_staging_table 条包含 ATTACHMENT_SENT_FLAG = 'N' 的记录,像这样:

SELECT 
    case_staging_table.CASE_NUMBER,
    case_staging_table.CASE_DETAILS,
    attachment_staging_table.ATTACHMENT_NAME
FROM
    case_staging_table
    LEFT JOIN attachment_staging_table 
        ON case_staging_table.PARENT_ID_NUMBER = attachment_staging_table.PARENT_ID_NUMBER
WHERE 
    case_staging_table.PROCESSED_FLAG IS NULL
    AND case_staging_table.PARENT_ID_NUMBER not in 
        ( select x.PARENT_ID_NUMBER
          from attachment_staging_table x      
          where x.ATTACHMENT_SENT_FLAG = 'N'
            )