我是新手加入,我确信这非常简单。
如果我在查询中删除了一个连接,则无论我删除哪个连接,查询的其余部分都会起作用。但如图所示,它给出了错误,表示该列不存在。有什么指针吗?
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
感谢
答案 0 :(得分:1)
我会猜测有一个名为carrier_id
的列可用于加入carrier
和customer
表。鉴于这种假设,试试这个:
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
表(在括号内)。