[英]Atleast one and atleast not one
要求:
对于策略:至少一件商品 (RAP03.propid) 有折扣 (rap14.covid = 'SS') 并且至少一件商品没有折扣 (SS)。 假设我们有一个策略 (rap01.plcy),并且使用这个策略我们有 2 个项目 (rap03.propid)。 因此,一件物品 SS 应该在那里,一件物品 SS 不应该在那里。 我在下面尝试过,但记录为零。 有什么办法可以同时检查这两种情况。
我们还必须尊重政策和项目(PROPID)。 一个 propid 必须包含 SS,但另一个 propid 不得包含 SS。
要求的结果:
PLCY, PROPID, COVID
000000967428613 010 SS
000000967428613 011 BB
AND EXISTS
(SELECT 1
/*+ use_hash(RAP03 rap14) */
FROM rap03
JOIN rap14
ON rap14.j31_pt_line_cat_cd = rap01.j01_PT_LINE_CAT_CD
AND rap14.j31_pt_cdb_part_id = rap01.j01_PT_CDB_PART_ID
AND rap14.j31_pt_state_cd = rap01.j01_PT_STATE_CD
AND rap14.plcy = RAP01.plcy
AND rap14.propid = RAP03.propid
AND trim(rap14.covid) = 'SS'
AND tt.JA2_EFFDT_T BETWEEN rap14.enddt_t AND (rap14.dropdt_t - 1)
--
WHERE RAP03.J12_PT_LINE_CAT_CD = RAP01.J01_PT_LINE_CAT_CD
AND RAP03.J12_PT_CDB_PART_ID = RAP01.J01_PT_CDB_PART_ID
AND RAP03.J12_PT_STATE_CD = RAP01.J01_PT_STATE_CD
AND RAP03.PLCY = RAP01.PLCY
AND tt.JA2_EFFDT_T BETWEEN rap03.adddt_t AND (rap03.dropdt_t - 1)
)
--
AND NOT EXISTS
(SELECT 1
/*+ use_hash(RAP03 rap14) */
FROM rap03
JOIN rap14
ON rap14.j31_pt_line_cat_cd = rap01.j01_PT_LINE_CAT_CD
AND rap14.j31_pt_cdb_part_id = rap01.j01_PT_CDB_PART_ID
AND rap14.j31_pt_state_cd = rap01.j01_PT_STATE_CD
AND rap14.plcy = RAP01.plcy
AND rap14.propid = RAP03.propid
AND trim(rap14.covid) = 'SS'
AND tt.JA2_EFFDT_T BETWEEN rap14.enddt_t AND (rap14.dropdt_t - 1)
--
WHERE RAP03.J12_PT_LINE_CAT_CD = RAP01.J01_PT_LINE_CAT_CD
AND RAP03.J12_PT_CDB_PART_ID = RAP01.J01_PT_CDB_PART_ID
AND RAP03.J12_PT_STATE_CD = RAP01.J01_PT_STATE_CD
AND RAP03.PLCY = RAP01.PLCY
AND tt.JA2_EFFDT_T BETWEEN rap03.adddt_t AND (rap03.dropdt_t - 1)
)
您当前有WHERE EXISTS(query) AND NOT EXISTS(query)
并且两个查询是相同的; 这总是错误的。
我认为您想要的逻辑是WHERE (at least one record exists with 'SS') AND (at least one record exists that's not 'SS')
AND EXISTS
(SELECT 1
/*+ use_hash(RAP03 rap14) */
FROM rap03
JOIN rap14
ON rap14.j31_pt_line_cat_cd = rap01.j01_PT_LINE_CAT_CD
AND rap14.j31_pt_cdb_part_id = rap01.j01_PT_CDB_PART_ID
AND rap14.j31_pt_state_cd = rap01.j01_PT_STATE_CD
AND rap14.plcy = RAP01.plcy
AND rap14.propid = RAP03.propid
AND trim(rap14.covid) = 'SS'
AND tt.JA2_EFFDT_T BETWEEN rap14.enddt_t AND (rap14.dropdt_t - 1)
--
WHERE RAP03.J12_PT_LINE_CAT_CD = RAP01.J01_PT_LINE_CAT_CD
AND RAP03.J12_PT_CDB_PART_ID = RAP01.J01_PT_CDB_PART_ID
AND RAP03.J12_PT_STATE_CD = RAP01.J01_PT_STATE_CD
AND RAP03.PLCY = RAP01.PLCY
AND tt.JA2_EFFDT_T BETWEEN rap03.adddt_t AND (rap03.dropdt_t - 1)
)
--
AND EXISTS -- CHANGE HERE (NOT removed)
(SELECT 1
/*+ use_hash(RAP03 rap14) */
FROM rap03
JOIN rap14
ON rap14.j31_pt_line_cat_cd = rap01.j01_PT_LINE_CAT_CD
AND rap14.j31_pt_cdb_part_id = rap01.j01_PT_CDB_PART_ID
AND rap14.j31_pt_state_cd = rap01.j01_PT_STATE_CD
AND rap14.plcy = RAP01.plcy
AND rap14.propid = RAP03.propid
AND trim(rap14.covid) <> 'SS' -- CHANGE HERE (= becomes <>)
AND tt.JA2_EFFDT_T BETWEEN rap14.enddt_t AND (rap14.dropdt_t - 1)
--
WHERE RAP03.J12_PT_LINE_CAT_CD = RAP01.J01_PT_LINE_CAT_CD
AND RAP03.J12_PT_CDB_PART_ID = RAP01.J01_PT_CDB_PART_ID
AND RAP03.J12_PT_STATE_CD = RAP01.J01_PT_STATE_CD
AND RAP03.PLCY = RAP01.PLCY
AND tt.JA2_EFFDT_T BETWEEN rap03.adddt_t AND (rap03.dropdt_t - 1)
)
将它们结合起来可以减少代码,但实际上可能会更慢,因为它不能在找到的第一条记录处“停止”......
AND EXISTS
(
SELECT 1
/*+ use_hash(RAP03 rap14) */
FROM rap03
JOIN rap14
ON rap14.j31_pt_line_cat_cd = rap01.j01_PT_LINE_CAT_CD
AND rap14.j31_pt_cdb_part_id = rap01.j01_PT_CDB_PART_ID
AND rap14.j31_pt_state_cd = rap01.j01_PT_STATE_CD
AND rap14.plcy = RAP01.plcy
AND rap14.propid = RAP03.propid
AND tt.JA2_EFFDT_T BETWEEN rap14.enddt_t AND (rap14.dropdt_t - 1)
--
WHERE RAP03.J12_PT_LINE_CAT_CD = RAP01.J01_PT_LINE_CAT_CD
AND RAP03.J12_PT_CDB_PART_ID = RAP01.J01_PT_CDB_PART_ID
AND RAP03.J12_PT_STATE_CD = RAP01.J01_PT_STATE_CD
AND RAP03.PLCY = RAP01.PLCY
AND tt.JA2_EFFDT_T BETWEEN rap03.adddt_t AND (rap03.dropdt_t - 1)
HAVING
MAX(CASE WHEN TRIM(rap14.covid) = 'SS' THEN 1 ELSE 0 END) = 1
AND
MIN(CASE WHEN TRIM(rap14.covid) = 'SS' THEN 1 ELSE 0 END) = 0
)
可能有更好的方法来制定查询,但我们需要更多的上下文(表定义、完整查询、完整逻辑解释等)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.