on子句错误中的未知列

时间:2013-02-11 15:48:20

标签: mysql sql join left-join cross-join

嘿伙计们,我能够代表我希望展示的数据 相关列是a.state_Id。 我从研究中了解到a.State_Id超出了范围。我的sql语句缺少什么?

如果我取出a.State_ID = c.State_Id只留下b.Product_Id = c.Product_Id,则会显示数据,但我需要与州和产品进行匹配。

我知道我需要在某处添加另一个join,但我不确定如何。如果有人能帮助我那会很棒!

SELECT a.state_id, 
       a.state_name, 
       a.state_abbreviatedname, 
       b.product_id, 
       b.product_name, 
       c.stateproduct_price 
FROM   states a, 
       products b 
       LEFT OUTER JOIN stateproducts c 
ON a.state_id = c.state_id AND b.product_id = c.product_id 

更新1

状态表已填充并包含以下字段:

State_Id
State_Name
State_AbbreviatedName

已填充的Products表包含基础产品。该表包含以下字段:

Product_Id
Product_Name

每个州都有相同的产品,但每个产品的价格随每个州而变化。这就是我有StateProducts表的原因。此表为空,将由我创建的接口逐个填充。 statesproducts表将包含以下字段

State_Id //reference/relational field to be user for comparison
Product_Id //reference/relational field to be user for comparison
StateProduct_Price //new field

所以我明白我会在价格列中收到NULL值。

我已经能够退回州和产品表的某种产品。但是,我现在需要在此cartesion表的右侧附加每个组合的价格。 请记住,stateproducts表是空的,我将如何实现这一目标?

3 个答案:

答案 0 :(得分:2)

我猜你有一个Many-to-Many关系,其中States可以有多个Products,而Products可以位于不同的States。因此,您需要将States加入映射表StateProducts,以便能够在表Products上获取产品。

SELECT  a.State_ID, 
        a.State_Name, 
        a.State_AbbreviatedName, 
        b.Product_Id, 
        b.Product_Name, 
        c.StateProduct_Price
FROM    States a
        INNER JOIN StateProducts c
            ON a.State_ID = c.State_Id
        INNER  JOIN Products b 
            ON b.Product_Id = c.Product_Id

要进一步了解联接,请访问以下链接:

更新1

使用CROSS JOIN关键字,

SELECT a.state_id, a.state_name, a.state_abbreviatedname, b.product_id, b.product_name, c.stateproduct_price 
FROM   states a 
       CROSS JOIN products b 
       LEFT OUTER JOIN stateproducts c
          ON a.state_id = c.state_id AND 
             b.product_id = c.product_id

答案 1 :(得分:2)

从A到C,C到B.

通过对每个进行LEFT JOIN,无论是否有实际的州产品,您仍然会得到所有可能的状态。

SELECT 
      a.State_ID, 
      a.State_Name, 
      a.State_AbbreviatedName, 
      b.Product_Id, 
      b.Product_Name, 
      c.Product_Price 
   FROM 
      States a
         LEFT  JOIN StateProducts c 
            ON a.State_ID = c.State_Id 
            LEFT JOIN Products b 
               ON  c.Product_Id = b.Product_Id

答案 2 :(得分:0)

尝试编写像这样的from子句:

from StateProducts c join
     States a
     on c.state_id = c.state_id join
     Products b
     on c.product_id = b.product_id

对于笛卡尔积(即获得状态和产品的所有例子):

SELECT s.state_id, s.state_name, s.state_abbreviatedname, 
       p.product_id, p.product_name, 
       sp.stateproduct_price 
from States s cross join
     Products p left outer join
     StateProducts sp
     on sp.state_id = s.state_id and
        sp.product_id = p.product_id