sql连接中'on子句'上的未知列?

时间:2013-02-16 19:05:19

标签: sql

请各位帮助我理解加入的SQL规范。我不明白。我一直在on子句上遇到名为Unknown column list的错误。 我的SQL语法出现了这个错误,我几乎把它擦在脸上我只是无法理解它为什么不起作用,我已经阅读了一些关于它是因为优先等的文章但是我真的很困惑我的SQL这里做错了。

select product.name , product.price from product inner join product_category on          
(product_category.product_no = product.product_no ) where product_category.sub_category = 
"COFFIN";

我知道这个问题在这里被问了几百次,但我看到的这些问题在这个非常基本的sql语法中并不复杂。

帮助我解决问题。

编辑: 我刚才意识到我的product_category不是我产品表的直接子项 我刚输入了

 select * from product 
 join specifications 
 join product_category on ( specifications.product_no = product_category.product_no);

但这仍然给我一个错误,未知的列product_category。

我已阅读并遵循与此网站类似的一些说明: MYSQL unknown clause join column in next join Unknown column {0} in on clause MySQL "Unknown Column in On Clause"

我真的很沮丧。我真的无法让它发挥作用。

4 个答案:

答案 0 :(得分:4)

对于您加入查询的每个新表,每个表必须至少有一个ON子句。如果不知道架构(表名,列等),很难确切地知道你要做什么,但这是一个例子

select *
from product p
join specifications s
    on p.product_no = s.product_no
join product_category pc
    on pc.spec_no = p.spec_no

也可以在表别名上查看此链接。给出一个关于连接的好例子+关于如何提高SQL可读性的真正有用的信息 http://msdn.microsoft.com/en-us/library/ms187455(v=sql.90).aspx

我发现这篇文章很有用,它可以直观地显示不同类型的连接 http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

答案 1 :(得分:1)

您缺少指定产品和规格之间的连接条件的部分。

select * from product 
join specifications YOU NEED SOMETHING HERE
join product_category on etc

答案 2 :(得分:1)

我修改了SQL语法看起来像这样,我忽略了一个将product_category连接到规范的键,所以我做了必要的链接并且它工作了!!!

SELECT *
FROM product
JOIN specifications ON ( product.product_no = specifications.product_no )
JOIN product_category ON ( specifications.spec_no = product_category.spec_no )
WHERE product_category.sub_category = "COFFIN"
LIMIT 0 , 30

还要感谢缺少规格的连接条件。这种粗心大意花了这么多时间。 非常感谢你!

答案 3 :(得分:1)

默认联接类型为inner join。因此,如果您编写join,数据库将显示inner join,并坚持要求您包含on子句。

如果您想在没有条件的情况下加入,请明确指定cross join

 select  * 
 from    product p
 cross join 
         specifications s
 inner join 
         product_category pc 
 on      pc.product_no = p.product_no
 left join
         some_other_table sot
 on      1=1

具有on 1=1条件的最后一次加入是执行cross join的另一种方式。它略有不同,因为它会从左表返回行,即使右表是空的。

Example at SQL Fiddle.