簡體   English   中英

SQL IN或EXISTS子句問題

[英]SQL IN or EXISTS clause issue

我想合並兩個獨立的查詢,但是我一直在努力獲得想要的結果。 一個匯總表中的所有值,另一個根據最新日期選擇重復的行。

第一個查詢的簡化版本是:

SELECT a.PLANT_NO "PlantNumber", 
       SUM(CASE WHEN a.REC_STATUS_CD = 'RR' THEN -a.KW_CTR_REDELIVERED_HV 
                ELSE a.KW_CTR_REDELIVERED_HV END) "KeepWholeResidueMMBtu", 
       SUM(a.ETH_APPLIED_POP_PCT + a.ISO_APPLIED_POP_PCT  + 
           (CASE WHEN a.PLANT_NO = '002' THEN a.ALTLIQ_APPLIED_POP_PCT ELSE 0 END)
          )/100 "NGLPOPPaymentPercent"
FROM GAS_STMT a 
INNER JOIN SETTLE_SUMMARY c
   ON CASE WHEN SUBSTR(a.TRNX_ID,1,1) = '-' 
           THEN SUBSTR(a.TRNX_ID, 2, LENGTH(a.TRNX_ID)) 
           ELSE CAST(a.TRNX_ID AS VARCHAR2(100)) 
      END = c.TRNX_ID
  AND a.MTR_NO||a.MTR_SFX = c.MTR_NO||c.MTR_SFX
WHERE TO_CHAR(a.PROD_DT, 'YYYY')  >= TO_CHAR(ADD_MONTHS(SYSDATE, -36), 'YYYY') 
  AND a.STATUS_UNIT_TM_CD = 'M' 
GROUP BY a.PLANT_NO
ORDER BY a.PLANT_NO

另一個查詢用於根據最近的交易日期篩選出四筆交易。

SELECT a.*
FROM GAS_STMT a,
     (SELECT MTR_NO,MTR_SFX,TRNX_ID,REC_STATUS_CD,MAX(ACCT_DT) ACCT_DT
      FROM GAS_STMT
      WHERE REC_STATUS_CD = 'RR'
      GROUP BY MTR_NO, MTR_SFX, TRNX_ID, REC_STATUS_CD
      HAVING COUNT(TRNX_ID) > 1) b
WHERE a.MTR_NO = b.MTR_NO
  AND a.TRNX_ID = b.TRNX_ID AND a.REC_STATUS_CD = b.REC_STATUS_CD
  AND a.ACCT_DT = b.ACCT_DT

我想我可以使用NOT INNOT EXISTS使第一個查詢求和,除了第二個查詢中排除的那四個記錄。 使用EXISTS可以得到與第一個查詢相同的結果,而使用NOT EXISTS不會得到任何結果。 當我使用IN我得到了排除記錄的總和,這與我想要的相反。

有沒有在PL / SQL中執行此操作的好方法? 我很困惑,我沒有得到關於NOT EXISTS查詢的任何記錄。

第一個查詢結果示例:

  1. Plant_No- 總和
  2. 002-100
  3. 450-50
  4. 500-50

第二個查詢結果的示例:

  1. Trnx_ID - Plant_no - KW_CTR_REDELIVERED_HV
  2. 1234-002--.99
  3. 1235-002--.99

預期結果:

  1. Plant_No- 總和
  2. 002-98.02
  3. 450-50
  4. 500-50

如果要排除第二個查詢返回的記錄,請嘗試:

SELECT a.PLANT_NO "PlantNumber", 
       SUM(CASE WHEN a.REC_STATUS_CD = 'RR' THEN -a.KW_CTR_REDELIVERED_HV 
                ELSE a.KW_CTR_REDELIVERED_HV END) "KeepWholeResidueMMBtu", 
       SUM(a.ETH_APPLIED_POP_PCT + a.ISO_APPLIED_POP_PCT  + 
           (CASE WHEN a.PLANT_NO = '002' THEN a.ALTLIQ_APPLIED_POP_PCT ELSE 0 END)
          )/100 "NGLPOPPaymentPercent"
FROM GAS_STMT a 
INNER JOIN SETTLE_SUMMARY c
   ON CASE WHEN SUBSTR(a.TRNX_ID,1,1) = '-' 
           THEN SUBSTR(a.TRNX_ID, 2, LENGTH(a.TRNX_ID)) 
           ELSE CAST(a.TRNX_ID AS VARCHAR2(100)) 
      END = c.TRNX_ID
  AND a.MTR_NO||a.MTR_SFX = c.MTR_NO||c.MTR_SFX
LEFT JOIN (SELECT MTR_NO,MTR_SFX,TRNX_ID,REC_STATUS_CD,MAX(ACCT_DT) ACCT_DT
           FROM GAS_STMT
           WHERE REC_STATUS_CD = 'RR'
           GROUP BY MTR_NO, MTR_SFX, TRNX_ID, REC_STATUS_CD
           HAVING COUNT(TRNX_ID) > 1) b
   ON a.MTR_NO = b.MTR_NO 
  AND a.TRNX_ID = b.TRNX_ID 
  AND a.REC_STATUS_CD = b.REC_STATUS_CD 
  AND a.ACCT_DT = b.ACCT_DT
WHERE TO_CHAR(a.PROD_DT, 'YYYY')  >= TO_CHAR(ADD_MONTHS(SYSDATE, -36), 'YYYY') 
  AND a.STATUS_UNIT_TM_CD = 'M' 
  AND b.MTR_NO IS NULL
GROUP BY a.PLANT_NO
ORDER BY a.PLANT_NO

以與第二個查詢相同的方式將b從第二個查詢連接到第一個查詢,即

inner join (SELECT MTR_NO,MTR_SFX,TRNX_ID,REC_STATUS_CD,MAX(ACCT_DT) ACCT_DT
  FROM GAS_STMT
  WHERE REC_STATUS_CD = 'RR'
  GROUP BY MTR_NO, MTR_SFX, TRNX_ID, REC_STATUS_CD
  HAVING COUNT(TRNX_ID) > 1) b 
 on a.MTR_NO = b.MTR_NO
   AND a.TRNX_ID = b.TRNX_ID AND a.REC_STATUS_CD = b.REC_STATUS_CD
   AND a.ACCT_DT = b.ACCT_DT

這樣,您將從第一個查詢中獲取所有內容,但僅從第二個查詢中將顯示的行中獲取所有內容

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM