将 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
条件,我只提取案例尚未处理的案例记录,并且所有附件记录都包含 Y
或ATTACHMENT_SENT_FLAG
列中的 NULL
(如果个案记录不包含附件,则会出现 NULL
)。如果附件暂存 table 中的任何一条相关记录在 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_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'
)
我正在寻求一些帮助,以将 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
条件,我只提取案例尚未处理的案例记录,并且所有附件记录都包含 Y
或ATTACHMENT_SENT_FLAG
列中的 NULL
(如果个案记录不包含附件,则会出现 NULL
)。如果附件暂存 table 中的任何一条相关记录在 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_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'
)