我想将两个表连接在一起,这些表是运行表和餐厅表。从运行表我需要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很新)
答案 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 JOIN
和restaurant_history
之间创建了run
- 这是我确定您不想要的。
但是只是从FROM
子句中删除第二个表仍然会在run_id
语句中给出关于不明确的列(SELECT
)的错误。这个列存在于两个表中(我们可以从JOIN
看到),并且没有明确告诉它选择哪个表,它不知道如何处理该列并将抛出错误。
要解决此问题,您还需要对表(我在解决方案中添加的H
和R
别名)进行别名。
有关不同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;