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

问题描述 投票:0回答:1

我收到了错误

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

因为下面的case语句返回两条记录。它不会返回两个记录,如果它可以从a.STRUCT_DOC_id条款中引用相同的where,这是较大的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
sql oracle case
1个回答
0
投票

根据我的理解,你试图为“伤口”相关的记录返回一个字段的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。为别名设置别名后,您应该只通过别名引用它

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

© www.soinside.com 2019 - 2024. All rights reserved.