0

我正在对我们的 Oracle 数据库进行查询。

目标是返回以下列 -

  1. 文档编号
  2. 文件创建日期
  3. 组织机构代码
  4. 文件状态
  5. 总金额

我遇到的问题是组织代码。可以有一个包含多个组织代码的文档 ID。我只想要 1 个实例 - 我不关心其余的(如果它们存在)

这是我目前拥有的 -

    SELECT * FROM (SELECT DISTINCT (K_HDR.DOC_HDR_ID), 
        K_HDR.CRTE_DT, 
        FS_EXT.VAL AS ORG_CODE,
        REQ.REQS_STAT_CD,
        FS_DOC.FDOC_TOTAL_AMT
    FROM PUR_REQS_T REQ, 
        KREW_DOC_HDR_T K_HDR, 
        FS_DOC_HEADER_T FS_DOC,
        KREW_DOC_HDR_EXT_T FS_EXT
    WHERE REQ.FDOC_NBR = K_HDR.DOC_HDR_ID AND
        FS_DOC.FDOC_NBR = REQ.FDOC_NBR AND
        REQ.FDOC_NBR = FS_EXT.DOC_HDR_ID(+) AND
        FS_EXT.KEY_CD(+)= 'organizationCode' AND
        (K_HDR.CRTE_DT BETWEEN TO_DATE('2011-10-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS') 
        AND 
         TO_DATE('2012-09-30 23:59:59', 'YYYY-MM-DD HH24:MI:SS')))
    FINAL_SEARCH ORDER BY FINAL_SEARCH.CRTE_DT;

以下查询返回 14,933 行。我应该得到的正确行数是 14,789。

罪魁祸首是组织代码。例如,当我查看结果集时,我看到以下内容 -

 DOC_ID   CRTE_DT      ORG_CD    STAT    TOTAL
 .
 .
 .
 496256    5-OCT-11     0        CLOS    2779.89
 496258    5-OCT-11     8050     CLOS    1737.5
 496258    5-OCT-11     8000     CLOS    1737.5
 .
 .
 .

如何摆脱 FS_EXT 表中令人讨厌的 496258 的第二个实例?(显然我需要摆脱相同类型重复值的其他实例)

4

2 回答 2

1

您可以将整个东西包装在另一个SELECT中,它使用 aGROUP BY仅获取MIN组织代码。

于 2012-11-14T18:56:57.733 回答
1

所以 - 我最终使用 FS_EXT 表中的另一列来进一步过滤到组织代码的第一个实例。

如果我正在查看经过过滤以仅显示 Document Id = 496258 条目的列,这就是 FS_EXT 表的样子。
(请注意,任何给定的 doc id 可能有不同的行数)

 DOC_HDR_EXT_ID     DOC_HDR_ID     KEY_CD                      VAL
 13318096           496258         documentDescription         misc items
 13318098           496258         organizationDocNumber       (null)
 13318099           496258         statusDescription           Closed
 13318101           496258         chartAndOrgCodeForResult    KS-1234
 13318102           496258         vendorName                  APPLE COMPUTERS
 13318103
 .
 .
 .
 .
 .
 13318115           496258         organizationCode            8000
 13318116
 .
 .
 .
 1338118            496258         organizationCode            8050

这是我的新查询,它绕过了使用连接操作。

请注意,我改用了 SUBQUERY。为了获得 OrganizationCode 的第一个实例,我在 DOC_HDR_EXT_ID 列上使用 MIN 运算符,然后使用该 ID 检索 organizationCode VAL 并将其传递回主 QUERY。

    SELECT * FROM ( SELECT DISTINCT (K_HDR.DOC_HDR_ID), 
         K_HDR.CRTE_DT, 
         (SELECT KS_EXT.VAL AS ORG_CODE 
              FROM KREW_DOC_HDR_EXT_T KS_EXT 
              WHERE KS_EXT.DOC_HDR_EXT_ID =(
              SELECT MIN(DOC_HDR_EXT_ID) 
              FROM KREW_DOC_HDR_EXT_T FS_EXT_INNER
              WHERE FS_EXT_INNER.DOC_HDR_ID = K_HDR.DOC_HDR_ID 
              AND FS_EXT_INNER.KEY_CD = 'organizationCode')) AS ORG_CODE,
         REQ.REQS_STAT_CD,
         FS_DOC.FDOC_TOTAL_AMT
         FROM PUR_REQS_T REQ, 
         KREW_DOC_HDR_T K_HDR, 
         FS_DOC_HEADER_T FS_DOC,
         KREW_DOC_HDR_EXT_T FS_EXT
         WHERE REQ.FDOC_NBR = K_HDR.DOC_HDR_ID AND
               FS_DOC.FDOC_NBR = REQ.FDOC_NBR AND
               REQ.FDOC_NBR = FS_EXT.DOC_HDR_ID(+) AND
               FS_EXT.KEY_CD(+)= 'organizationCode' AND
               (K_HDR.CRTE_DT BETWEEN TO_DATE('2011-10-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('2012-09-30 23:59:59', 'YYYY-MM-DD HH24:MI:SS')))
     FINAL_SEARCH ORDER BY FINAL_SEARCH.CRTE_DT;

感谢您的推荐@Alex Poole 和@StilesCrisis。你让我对我解决这个问题的方法有了不同的想法,我的解决方案整合了你的两个建议。来自 Stiles 的 MIN 方法,并根据 Alex Poole 过滤另一列。

于 2012-11-14T22:41:05.260 回答