如何修复程序中的“歧义”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 如何修复“无法推断复杂的闭包返回类型;添加显式类型以消除歧义”

如何修复此 SELECT 语句中的错误 INTO 子句

如何使用自动布局 beta 7 UIKIT 修复 xcode 11 中可滚动内容大小的歧义

即使插入了列,“WHERE”子句中的 SQL 未知列