繁体   English   中英

至少一个,至少没有一个

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM