[英]How to join these 3 tables in SQL?
I'm looking for the right SQL request.我正在寻找正确的 SQL 请求。 I'm using SQLite.我正在使用 SQLite。
I have one principal table "cmdb":我有一个主表“cmdb”:
name | env | type
-------------------------
VMV1 | Prod | Virtual
SP | Dev | Physical
VMO1 | Dev | Virtual
I have another table "vmv":我有另一个表“vmv”:
name | dns | host | management
---------------------------------------
VMV1 | VMV1.local | Host1 | Man1
VMV2 | VMV2.local | Host1 | Man1
And a another table "vmo":还有另一个表“vmo”:
name | dns | host | management
---------------------------------------
VMO1 | VMO1.local | Host2 | Man2
VMO2 | VMO2.local | Host2 | Man2
Here is what I would like to get:这是我想得到的:
name | management | dns | env | type
-------------------------------------------------
VMV1 | Man1 | VMV1.local | Prod | Virtual
VMV2 | Man1 | VMV2.local | |
SP | | | Dev | Physical
VMO1 | Man2 | VMO1.local | Dev | Virtual
VMO2 | Man2 | VMO2.local | |
but I cannot manage to get the right result...但我无法获得正确的结果......
Here is what got me the closest to the result.这是让我最接近结果的原因。 You can see that I'm not really good at all in making SQL requests more complex than "select * from table1"... I tried a lot of combinations and studied lots of examples on stackoverflow and others websites about UNION, JOIN and other SQL keywords but I unfortunetly still don't get it.您可以看到,在使 SQL 请求比“从 table1 中选择 *”更复杂方面,我一点也不擅长……我尝试了很多组合,并在 stackoverflow 和其他网站上研究了很多关于 UNION、JOIN 等的示例SQL 关键字,但不幸的是我仍然不明白。 That's why I'm looking now for help here.这就是我现在在这里寻求帮助的原因。
SELECT
c.name,
v.management,
v.dns,
c.env,
c.type
FROM cmdb AS c
LEFT JOIN vmv AS v ON v.name = c.name
LEFT JOIN vmo AS o ON o.name = c.name
My result is:我的结果是:
name | management | dns | env | type
-----------------------------------------------
VMV1 | Man1 | VMV1.local | Prod | Virtual
SP | | | Dev | Physical
VMO1 | | VMO1.local | Dev | Virtual
You can join with LEFT
joins all the distinct names of the 3 tables with each of the tables:您可以使用LEFT
将 3 个表的所有不同名称与每个表连接:
select t.name,
coalesce(v.management, o.management) management,
coalesce(v.dns, o.dns) dns,
c.env,
c.type
from (
select name from cmdb union
select name from vmv union
select name from vmo
) t
left join cmdb c on c.name = t.name
left join vmv v on v.name = t.name
left join vmo o on o.name = t.name
Or:或者:
select t.name,
n.management,
n.dns,
c.env,
c.type
from (
select name from cmdb union
select name from vmv union
select name from vmo
) t
left join cmdb c on c.name = t.name
left join (
select name, dns, management from vmv
union all
select name, dns, management from vmo
) n on n.name = t.name
Results:结果:
| name | management | dns | env | type |
| ---- | ---------- | ---------- | ---- | -------- |
| SP | | | Dev | Physical |
| VMO1 | Man2 | VMO1.local | Dev | Virtual |
| VMO2 | Man2 | VMO2.local | | |
| VMV1 | Man1 | VMV1.local | Prod | Virtual |
| VMV2 | Man1 | VMV2.local | | |
In principle it looks like you want to do a UNION
of vmo
and vmv
, then do a FULL OUTER JOIN
of that result with cmdb
.原则上,您似乎想要对vmo
和vmv
进行UNION
,然后使用cmdb
对该结果进行FULL OUTER JOIN
。 I am not familiar with sqlite so I don't know if the exact syntax might be different from what I would write for Oracle (or if it even supports these operations).我不熟悉 sqlite 所以我不知道确切的语法是否可能与我为 Oracle 编写的不同(或者它是否甚至支持这些操作)。
Here's what I would try:这是我会尝试的:
SELECT NVL(cmdb.name, vm_all.name), management, dns, env, type
FROM
cmdb
FULL OUTER JOIN (
SELECT name, management, dns FROM vmv
UNION ALL
SELECT name, management, dns FROM vmo
) vm_all
ON vm_all.name = cmdb.name
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.