如何在程序中修复“模糊”where子句

时间:2018-04-13 18:21:18

标签: mysql sql

我收到错误:

  

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``的表中连接数据。

我做错了什么?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

您收到错误,因为两个表中都有orderid。因此,SQL引擎不知道orderid子句引用了哪个where

让我假设您有一个名为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;

请注意,我还添加了表别名,因此查询更容易编写和阅读。

答案 2 :(得分:1)

不明确表示在FIELD

之前使用表名或别名

与where子句中的hsorders.orderId类似。

答案 3 :(得分:1)

连接表时使用别名。如果列在两个表中,将有助于区分列。

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子句