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