学习如何连接表但收到错误“非唯一表”

时间:2017-02-22 16:30:12

标签: mysql sql

我想将两个表连接在一起,这些表是运行表和餐厅表。从运行表我需要run_id和restaurant_id,并从餐厅表,我需要created_date所以最后,我有一个表包含每个餐厅的created_date。 run和restaurant_history表都有run_id,所以我知道我可以加入它们。我想出了类似的东西:

SELECT run_id, restaurant_id, created_date FROM restaurant_history, run
JOIN run ON restaurant_history.run_id = run.run_id;

但这给了我一个错误。任何帮助将不胜感激:)

(我对sql很新)

3 个答案:

答案 0 :(得分:0)

您正在混合隐式联接和显式联接。隐式连接语法(列出FROM子句中的表)已弃用over 25 years ago

作为一个简单的规则,永远不要在FROM子句中使用逗号:

SELECT R.run_id, restaurant_id, created_date 
FROM   restaurant_history H
JOIN   run                R ON H.run_id = R.run_id;

至于为什么它给你的错误,错误是双重的。让我们来看看你写的内容:

SELECT run_id, restaurant_id, created_date 
FROM   restaurant_history, run
JOIN   run ON restaurant_history.run_id = run.run_id;

之前的查询相当于以下内容:

SELECT     run_id, restaurant_id, created_date 
FROM       restaurant_history
CROSS JOIN run
INNER JOIN run ON restaurant_history.run_id = run.run_id;

错误的原因是因为您在查询中列出了两次表run,而没有别名来区分两者。 ON子句引用了run表,但它不知道你的意思。

此外,您无意中在CROSS JOINrestaurant_history之间创建了run - 这是我确定您不想要的。

但是只是从FROM子句中删除第二个表仍然会在run_id语句中给出关于不明确的列(SELECT)的错误。这个列存在于两个表中(我们可以从JOIN看到),并且没有明确告诉它选择哪个表,它不知道如何处理该列并将抛出错误。

要解决此问题,您还需要对表(我在解决方案中添加的HR别名)进行别名。

有关不同JOIN类型的详细信息,请参阅此问题:
What is the difference between "INNER JOIN" and "OUTER JOIN"?

有关显式与隐式JOIN的更多信息,请参见此处:
Bad habits to kick : using old-style JOINs

答案 1 :(得分:0)

SELECT run_id, restaurant_id, created_date 
FROM restaurant_history H 
INNER JOIN run R ON H.run_id = R.run_id

答案 2 :(得分:0)

尝试此查询

SELECT run_id, restaurant_id, created_date 
FROM restaurant_history  
INNER JOIN run ON restaurant_history.restaurant_id= run.run_id;