如何修复程序中的“歧义”where子句
Posted
技术标签:
【中文标题】如何修复程序中的“歧义”where子句【英文标题】:How to fix "ambiguous" where clause in procedure 【发布时间】:2018-04-13 18:21:17 【问题描述】:我收到一个错误:
1052 - where 子句中的列“orderId”不明确
当尝试做CALL GetOrderById(2000)
BEGIN
SELECT
hsorders.*,
hslineitem.partNum, hslineitem.price
FROM
hsorders
JOIN hslineitem ON hslineitem.orderId = hsorders.orderId
WHERE
orderId = orderId;
END
我需要传递一个Id
并连接两个具有相同 `orderId` 的表中的数据。
我做错了什么?
【问题讨论】:
显示完整代码。这个编程块在哪里? 【参考方案1】:您收到错误是因为orderid
在两个表中。因此,SQL 引擎不知道where
子句指的是哪个orderid
。
让我假设您有一个名为 orderid
的参数或变量。
该名称与表中同名的列冲突。这就是我使用前缀的原因。例如,如果orderid
作为参数传入,我将其命名为in_orderid
。如果它是一个局部变量,我可能会使用v_orderid
。
那么代码将如下所示:
BEGIN
SELECT o.*, li.partNum, li.price
FROM hsorders o JOIN
hslineitem li
ON li.orderId = o.orderId
WHERE o.orderId = v_orderId;
END;
请注意,我还添加了表别名,以便查询更易于编写和阅读。
【讨论】:
谢谢!虽然如果有意义的话,我必须将 v_orderId 更改为 li.orderId。【参考方案2】:你需要使用别名:
BEGIN
SELECT
hsorders.*,
hslineitem.partNum, hslineitem.price
FROM hsorders
JOIN hslineitem ON hslineitem.orderId = hsorders.orderId
WHERE
hsorders.orderId = p_orderId; -- I suggest to rename parameter to avoid
-- name collision
END
【讨论】:
【参考方案3】:不明确表示在FIELD之前使用表名或别名
像 where 子句中的 hsorders.orderId
。
【讨论】:
【参考方案4】:连接表时使用别名。如果它们在两个表中,区分列将很有帮助。
When to use alias
BEGIN
SELECT
HO.*,
HL.partNum, HL.price
FROM
hsorders HO
JOIN hslineitem HL
ON HO.orderId = HL.orderId
END
你已经使用 ON 子句给HO.orderId = HL.orderId
所以你不必再次使用 where 子句
【讨论】:
以上是关于如何修复程序中的“歧义”where子句的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 IN 修复 Hibernate Named Native Query 的 Where 子句
如果 where 子句已经修复,如何加快 spark sql 过滤器查询?
SwiftUI 如何修复“无法推断复杂的闭包返回类型;添加显式类型以消除歧义”