我发现很多关于根据来自第三方的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
?
答案 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
,除非有一些特殊需要(这里似乎不是这种情况),否则您无需在查询中再次指定它。