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

Posted

技术标签:

【中文标题】如何让查询引用它下面的`where`子句的`a.STRUCT_DOC_id`?【英文标题】:How can I get the query to reference the `a.STRUCT_DOC_id` of the `where` clause below it? 【发布时间】:2018-02-28 22:55:36 【问题描述】:

我得到了错误

"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

【问题讨论】:

CASE ... ... END 不是语句,而是条件表达式。 (将其与 C 中的三元 a?b:c 进行比较) 错误信息再清楚不过了。您的内部查询返回不止一行。修复它,然后错误就会消失。 b.STRUCT_DOC_id=a.STRUCT_DOC_id C.STRUCT_DOC_id=a.STRUCT_DOC_id 之间缺少AND min_value 来自哪个表? 可能是min(value) 而不是min_value 【参考方案1】:

据我了解,您正试图为“伤口”相关记录返回一些 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 语句内的子查询中的联接与外部选择中的联接相同(全部在 STRUCT_DOC_id 上) 您应该将 &lt;whatever field you are getting the "min" of&gt; 替换为您的实际字段 在您的 CASE 语句中,您有 ELSE '0'...如果您想返回一个数字字段,您应该去掉单引号 在您的原始查询中,您将包含表别名为C,但随后再次将其引用为上面的Inclusions.Wound_Included。一旦你给一个表起别名,你应该只通过它的别名来引用它

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

【讨论】:

以上是关于如何让查询引用它下面的`where`子句的`a.STRUCT_DOC_id`?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用动态数组使用where子句查询mysql数据库

PHP MySQL Where 子句

在 SQL Server 查询的 WHERE 子句中引用或 INNER JOIN 一个 Pandas 数据帧值 [重复]

是否可以在 Union All BigQuery SQL 中让 where 子句引用另一个 where 子句?

如何修复where子句中的聚合?

1.6 在WHERE子句中引用取别名的列