如何让查询引用它下面的`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
上)
您应该将 <whatever field you are getting the "min" of>
替换为您的实际字段
在您的 CASE
语句中,您有 ELSE '0'
...如果您想返回一个数字字段,您应该去掉单引号
在您的原始查询中,您将包含表别名为C
,但随后再次将其引用为上面的Inclusions.Wound_Included
。一旦你给一个表起别名,你应该只通过它的别名来引用它
我还没有测试过,但试一试,让我知道:)
【讨论】:
以上是关于如何让查询引用它下面的`where`子句的`a.STRUCT_DOC_id`?的主要内容,如果未能解决你的问题,请参考以下文章
在 SQL Server 查询的 WHERE 子句中引用或 INNER JOIN 一个 Pandas 数据帧值 [重复]