[英]mysql create view of two tables based on id from third
我發現了很多類似的文章,它們基於第三個ID合並兩個表,但是我似乎無法弄清楚其邏輯。
給出三個表
tableA
| uuid | ttl | ord |
-----------------------
| alpha| Alp | 1|
| beta| Bet | 2|
| gamma| Gam | 3|
tableB
| uuid | ttl | ord | tab_A_ref
--------------------------------
| joe | Jo | 1| alpha
| mike | Mi | 2| beta
| peter| Pe | 3| alpha
| alan | Pe | 4| beta
| tom | Pe | 5| gamma
tableC
| uuid | ttl | ord | tab_A_ref
--------------------------------
| jane | Ja | 1| alpha
| marg | Ma | 2| beta
| phobe | Ph | 3| alpha
| anon | An | 4| beta
| toni | To | 5| gamma
我想創建一個視圖myView
,其中tab_A_ref = alpha or beta
| uuid | ttl | ord | tab_A_ref
| joe | Jo | 1| alpha
| peter | Pe | 3| alpha
| jane | Ja | 1| alpha
| phobe | Ph | 3| alpha
| mike | Mi | 2| beta
| alan | Pe | 4| beta
| marg | Ma | 2| beta
| anon | An | 4| beta
使用基本聯接,
SELECT
tableB.uuid, tableB.ttl, tableB.ord, tableB.tab_A_ref
FROM tableB
INNER JOIN tableA on tableB.tab_A_ref = tableA.uuid
我擴展了合並兩者的邏輯
SELECT
tableB.uuid, tableB.ttl, tableB.ord, tableB.tab_A_ref,
tableC.uuid, tableC.ttl, tableC.ord, tableC.tab_A_ref,
FROM
tableB INNER JOIN tableA on tableB.tab_A_ref = tableA.uuid,
tableC INNER JOIN tableA on tableC.tab_A_ref = tableA.uuid
但這會產生錯誤, not unique table/alias: tableA
從其他帖子看來,我應該有一個嵌套的bracketed
JOIN,嘗試了多種組合都失敗了。 那么如何格式化第二個JOIN
?
所有表(臨時表,子查詢,物理表或其他表)必須在查詢中唯一地命名。
否則,數據庫引擎不知道您要指代哪個數據源。
您的原件:
SELECT
tableB.uuid, tableB.ttl, tableB.ord, tableB.tab_A_ref,
tableC.uuid, tableC.ttl, tableC.ord, tableC.tab_A_ref,
FROM
tableB INNER JOIN tableA on tableB.tab_A_ref = tableA.uuid,
tableC INNER JOIN tableA on tableC.tab_A_ref = tableA.uuid
在上面,查詢引擎如何知道要使用哪個tableA
? 您已經聲明了兩次。 記住,您正在應用一個過濾器( ON tableB.tab_A_ref = tableA.uuid
)-因此,您有兩個結果集(一個來自第一個ON tableB.tab_A_ref = tableA.uuid
,另一個不同於第二個ON tableB.tab_A_ref = tableA.uuid
),它們都被稱為tableA
。
只需使用別名( AS
)即可唯一地引用所有表(聯接表或其他表):
SELECT
tableB.uuid, tableB.ttl, tableB.ord, tableB.tab_A_ref,
tableC.uuid, tableC.ttl, tableC.ord, tableC.tab_A_ref,
FROM
tableB INNER JOIN tableA AS a_ref ON tableB.tab_A_ref = a_ref.uuid,
tableC INNER JOIN tableA AS b_ref ON tableC.tab_A_ref = b_ref.uuid
以下JOIN
邏輯不正確:
tableB INNER JOIN tableA on tableB.tab_A_ref = tableA.uuid,
tableC INNER JOIN tableA on tableC.tab_A_ref = tableA.uuid
查詢應為:
SELECT
tableB.uuid, tableB.ttl, tableB.ord, tableB.tab_A_ref
FROM tableB
INNER JOIN tableA
ON tableB.tab_A_ref = tableA.uuid
INNER JOIN tableC
ON tableC.tab_A_ref = tableA.uuid
這里使用的邏輯的本質是,第一個JOIN
已經創建了一個虛擬單元 ,可以根據需要將其與任何其他表連接。 tableA
已經在該JOIN
中發揮作用,除非有特殊需要(在這里似乎不是這種情況),否則您無需在查詢中再次指定它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.