mysql基于来自第三个的id创建两个表的视图

时间:2017-08-14 14:05:49

标签: mysql

我发现很多关于根据来自第三方的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

2 个答案:

答案 0 :(得分:2)

所有表(临时,子查询,物理或其他)必须在查询中唯一命名。

否则,数据库引擎不知道您指的是哪个数据源。

你的原文:

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) - 因此您有两个结果集(一个来自第一个连接,另一个来自第二个),它们都被称为{{1} }。

简单地说,使用别名(tableA)来唯一引用所有表(已连接或以其他方式):

AS

答案 1 :(得分:0)

以下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,除非有一些特殊需要(这里似乎不是这种情况),否则您无需在查询中再次指定它。