【问题标题】:unknown column in on clause erroron 子句错误中的未知列
【发布时间】:2013-01-26 18:15:06
【问题描述】:

大家好,我非常接近能够表示我希望显示的数据 有问题的列是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

states 表已被填充并包含以下字段:

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 值。

我已经能够返回 States 和 products 表的一种 cartesion 产品。但是,我现在需要在此 cartesion 表的右侧附加每个组合的价格。 记住 stateproducts 表是空的,我将如何做到这一点?

【问题讨论】:

  • 请停止混淆显式和隐式JOINs。
  • njk,我是一个 ios 程序员,而不是真正的数据库设计师。我目前正试图了解这一切。如果您可以通过不混合显式和隐式连接来解释您的意思,并向我们展示它们是如何编写的,这对我来说是有教育意义的。谢谢
  • @Pavan:请参阅 en.wikipedia.org/wiki/Join_%28SQL%29#Inner_joinstackoverflow.com/questions/44917/…,了解隐式连接和显式连接之间的区别。
  • 谢谢我会读到这个。欣赏参考指南。

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


【解决方案1】:

我猜你有一个Many-to-Many 关系,其中States 可以有多个ProductsProducts 可以在不同的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

【讨论】:

  • 嘿 JW,你的 sql 语句没有产生错误,但它产生了一个空集。我希望返回一个包含表States 和Products 的cartesion 产品的集合,并为每个生成的组合附加StateProducts 表中的价格。如果价格不存在,则仅在该特定行的价格列中返回 NULL,并且任何存在的行都显示该当前组合的价格。希望我已经说清楚了。如果您可以查看我更新的帖子,它可能会有所帮助。谢谢JW
  • 用关键字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
  • 嘿 JW,你在上面的评论中写的是我一直试图检索的数据集。如果您可以更新您的帖子,以便我可以将此问题标记为已回答。哈哈..好像在这种情况下只需要更改逗号的字母!谢谢你的帮助JW
  • 谢谢。至于您发布的有关 SQL 连接的可视化表示的文章,那将非常有帮助。干杯
【解决方案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

【讨论】:

  • DRapp 感谢您的发布,您提出的解决方案出现此错误:#1064 - 您的 SQL 语法有错误;查看与您的 MySQL 服务器版本相对应的手册,了解在“a.State_ID = c.State_Id LEFT JOIN Products b ON c.”附近使用的正确语法。在第 11 行,如果您可以查看我更新的帖子,以便获得更多信息,那么您可能会修改您的 sql 语句
  • @pavan,在查看您修改后的结构时,您似乎从“StateProduct_Price”开始,而不是“Product_Price”。我修改了查询,但这可能是您和其他人遇到的问题,因为他们都使用“StateProduct_Price”列。
  • 我看到你刚刚更改了行名?名称可以是任何名称,但为了便于阅读,我选择了 StateProduct_Price,因为它是每个州独有的产品价格。不过,你看过我对你帖子的第一条评论了吗?您的 sql 语句产生错误。
  • @Pavan,JOIN 条件似乎与您提供的列名匹配......但是,没有名为“StateProduct_Price”的列,而是“Product_Price”。它可能与特定状态相关联,但其实际列名仍然是“Product_Price”
  • 谢谢。我已经更新了我的更新参考。 StateProducts 表中有一个 StateProduct_Price,但我在帖子中不小心写下了 product_price。我已相应更新,但您的错误仍然存​​在。看看JW的答案。为你的帮助干杯 DRapp
【解决方案3】:

尝试像这样编写 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

【讨论】:

  • 感谢您抽出宝贵时间回答。 Gordon 这将返回一个空集,我正在尝试根据依赖于 state_id 和 product_id 的组合从另一个表中检索带有附加字段的笛卡尔集。看看我更新的帖子
猜你喜欢
  • 2018-05-12
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多