涉及同一个表的多个连接会产生“列不存在”错误 - MySQL

时间:2012-11-10 18:12:43

标签: mysql sql join

我是新手加入,我确信这非常简单。
如果我在查询中删除了一个连接,则无论我删除哪个连接,查询的其余部分都会起作用。但如图所示,它给出了错误,表示该列不存在。有什么指针吗?

select 

loc_carr.address1 as carr_addr1,

loc_cust.address1 as cust_addr1


from db_name.carrier, db_name.customer

join db_name.location as loc_carr on vats.carrier.location_id=loc_carr.location_id

join db_name.location as loc_cust on vats.customer.location_id=loc_cust.location_id

感谢

2 个答案:

答案 0 :(得分:1)

我会猜测有一个名为carrier_id的列可用于加入carriercustomer表。鉴于这种假设,试试这个:

select 
     loc_carr.address1 as carr_addr1
   , loc_cust.address1 as cust_addr1

from vats.carrier  as a

join vats.customer as b
  on b.carrier_id=a.carrier_id

join vats.location as loc_carr 
  on loc_carr.location_id=a.location_id

join vats.location as loc_cust 
  on loc_cust.location_id=b.location_id

请注意,对表引用使用别名可以使事情更容易阅读。另请注意我是如何使用显式SQL连接语法(而不是列出以逗号分隔的表)。

答案 1 :(得分:1)

@Bob Duell为您的问题提供解决方案。要更好地理解产生此错误的原因,请注意在FROM子句中,您使用显式JOIN语法和使用逗号的隐式连接来“连接”表:,这是(几乎)相当于CROSS JOIN。但JOIN的优先级高于逗号,运算符。所以,那部分解析如下:

FROM 
  ( db_name.carrier )
  , 
  (   ( db_name.customer
      JOIN db_name.location AS loc_carr 
          ON carrier.location_id = loc_carr.location_id      -- this line
      )                                                      -- gives the error
    JOIN join db_name.location AS loc_cust 
        ON customer.location_id = loc_cust.location_id
  )

在上面提到的行中,vats.carrier.location_id抛出错误,因为该范围内没有carrier表(在括号内)。