簡體   English   中英

mysql基於第三個id創建兩個表的視圖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM