2017-02-22 17 views
0

我想將兩個表連接在一起,即運行表和餐館表。從運行表中我需要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)

+1

請發佈表格模式,樣本輸入數據和所需的輸出。 – GurV

回答

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表,但它不知道你的意思。

此外,您無意中在restaurant_historyrun之間創建了CROSS JOIN - 我確定您不想要的東西。

但是,僅刪除FROM子句中的第二個表格,仍然會給出關於SELECT語句中模糊列(run_id)的錯誤。該列存在於兩個表中(如我們可以從JOIN看到的那樣),並且沒有明確地告訴它哪個表可以選擇,它不知道如何處理該列並且會引發錯誤。

要解決這個問題,您還需要別名表(我在解決方案中放入了HR別名)。


有關不同JOIN類型的詳細信息,請參閱這個問題:
What is the difference between "INNER JOIN" and "OUTER JOIN"?

有關顯性VS隱JOIN S比信息,請參見這裏:
Bad habits to kick : using old-style JOINs

+0

我現在正在看到「未知列restaurant_history.run_id在子句中」 – user7513750

+0

@ user7513750在這種情況下,您需要仔細查看錶格。 「餐廳_歷史」表中的哪一列與「運行」表格相同?或者,更好的是,你能否用表格定義更新你的問題? – Siyual

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

歡迎來到StackOverflow!防止人們在互聯網上盲目複製/粘貼代碼。您能否請添加一個有關此操作的註釋以及它如何解決OP的問題? –

0

嘗試此查詢

SELECT run_id, restaurant_id, created_date 
FROM restaurant_history 
INNER JOIN run ON restaurant_history.restaurant_id= run.run_id; 
相關問題