我正在寻求一些帮助,以便将SQL查询中的WHERE
条件细化为一组链接的Oracle数据暂存表。
其中一个表用于案例数据,包含有关记录的元数据。这张表上每个案例只有一条记录。该表上有一个标志列,一旦数据被读取并发送到另一个数据库,它就会将案例数据标记为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
第二个表用于附件数据,包含链接到案例数据的文件附件的元数据。此表上的每个案例可能有多个记录。如果生成的文件传输到服务器,则此表上有一个标志列将附件标记为"已发送"。附件_图纸_表格
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
条件,其中我只拉入案例尚未处理的案例记录,并且所有附件记录在ATTACHMENT_SENT_FLAG
列中都包含Y
或NULL
(如果案例记录不包含附件,则会出现NULL
(。如果附件暂存表中的任何一条相关记录的ATTACHMENT_SENT_FLAG
列中有N
,我不希望该案例记录出现在查询结果中。
在这种情况下:
- 案例编号
0001
尚未处理,有三个附件与其关联,并且只有一个附件已发送到服务器 - 案件编号
0002
尚未处理,也没有与其关联的附件 - 案件编号
0003
已经处理完毕
此阶段的查询结果应仅包括案例编号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_SENT_FLAG = 'N'
的attachment_staging_table
记录,如下所示:
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'
)