简体   繁体   English

如何在 SQL 中加入这 3 个表?

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

See the demo .请参阅演示

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

See the demo .请参阅演示

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 .原则上,您似乎想要对vmovmv进行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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM