首页 文章

如何让查询引用它下面的`where`子句的`a.STRUCT_DOC_id`?

提问于
浏览
0

我收到了错误

“ORA-01427:单行子查询返回多行01427. 00000 - ”单行子查询返回多行“

因为下面的case语句返回两条记录 . 如果它可以从 where 子句中引用相同的 a.STRUCT_DOC_id ,它将不会返回两个记录,该子句是较大的 select 的一部分 .

子查询返回两个记录,但如果它引用了 a.STRUCT_DOC_id ,它是较大查询的一部分,它只会引入一条记录 .

SELECT DISTINCT a.STRUCT_DOC_id,
         CASE WHEN Inclusions.Wound_Included = 'TRUE' 
                THEN (SELECT min_value 
                        FROM etIndivCommitt b,
                             mn_structured_contract AA 
                        WHERE b.STRUCT_DOC_id=AA.STRUCT_DOC_id AND
                              b.PP_Sub_Type like '%Wound%')
                ELSE '0'
                END Commitment_Value,
         a.Product_ID
        FROM
            mn_structured_contract a 
            GetIndivCommitt b,
            Inclusions C
        WHERE
            b.STRUCT_DOC_id=a.STRUCT_DOC_id
            C.STRUCT_DOC_id=a.STRUCT_DOC_id

1 回答

  • 0

    据我所知,你试图为"wound"相关记录返回一个字段的 MIN 值 . 那是对的吗?如果是这样,您可以尝试这样的事情:

    SELECT DISTINCT 
        src.STRUCT_DOC_id,
        CASE 
            WHEN src.Wound_Included = 'TRUE' THEN src.MinValueForWoundIncluded
            ELSE '0' 
        END Commitment_Value,
        src.Product_ID
    FROM (
        SELECT 
          a.STRUCT_DOC_id,
          a.Product_id,
          C.Wound_Included,
          MIN(
            CASE 
              WHEN PP_Sub_Type LIKE '%wound%' THEN <whatever field you are getting the "min" of> 
              ELSE NULL 
            END) OVER(PARTITION BY a.Struct_DOC_id) AS MinValueForWoundIncluded -- Return the MIN value for each Struct_DOC_id
        FROM mn_structured_contract a, GetIndivCommitt b, Inclusions C
        WHERE b.STRUCT_DOC_id=a.STRUCT_DOC_id
        AND C.STRUCT_DOC_id=a.STRUCT_DOC_id   
    ) src
    

    几点说明:

    • 这应该有效,因为你在 CASE 语句中的子查询中的连接与外部select中的连接相同(全部在 STRUCT_DOC_id 上)

    • 你应该用你的实际字段替换 <whatever field you are getting the "min" of>

    • 在您的 CASE 语句中,您有 ELSE '0' ...如果您想要返回一个数字字段,您应该删除单引号

    • 在原始查询中,您将Inclusions表别名为 C ,但随后再次将其称为 Inclusions.Wound_Included . 为别名设置别名后,您应该只通过别名引用它

    我没有测试过,但试一试让我知道:)

相关问题