如何在 Athena SQL 查询中从 3 个表中获取所需的数据?

Gan*_*kar 3 sql inner-join amazon-web-services presto amazon-athena

表 1 ( aws_complianceitem) 没有主键,该示例数据:

地位 严重程度 顺从型 标题 资源ID 地区
合规的 低的 安全 2002年补丁 i-76765434 ap-南-2
不合规的 高的 审计 2002 kb 补丁 i-76765434 ap-南-2
合规的 中等的 安全 2002 kb 补丁 i-98765434 ap-南-1

表 2 ( aws_instanceinformation) 将ipaddressinstanceid作为唯一键,并具有以下示例数据:

计算机名 实例ID IP地址 地位 帐户ID
SD-SDYH-re22 i-76765434 10.33.23.1 符合的 887878787654
不合规的 i-98765434 10.72.33.1 不合规的 098776765478

表 3 ( configinstancestate) 将ipaddressresourceid作为唯一键以及此示例数据:

资源ID IP地址 实例状态
i-76765434 10.33.23.1 跑步
i-98765434 10.72.33.1 停止了

我需要包含所有正在运行的instanceid 的数据。

这是期望的结果:

地位 实例状态 严重程度 标题 资源ID 地区 IP地址
合规的 跑步 低的 2002年补丁 i-76765434 ap-南-2 10.33.23.1
不合规的 跑步 高的 2002 kb 补丁 i-76765434 ap-南-2 10.33.23.1
合规的 停止了 中等的 2002 kb 补丁 i-98765434 ap-南-1 10.72.33.1

尝试使用以下查询进行完整外连接,

SELECT
    t1.status
    , t1.severity
    , t1.title
    , t1.region
    , t1.resourceid
    , t2.ipaddress
    , t2.computername
    , t2.status
    , t3.instancestate
FROM
    aws_complianceitem                      t1
    FULL OUTER JOIN aws_instanceinformation t2
        ON t1.resourceid = t2.instanceid
    FULL OUTER JOIN configinstancestate     t3
        ON t2.ipaddress = t3.resourceid
Run Code Online (Sandbox Code Playgroud)

但是我们过滤了作为此查询的一部分获得的结果,instancestate=blank,有空记录

GMB*_*GMB 5

看起来两个内部联接 - 具有相关条件 - 做你想做的事:

select ac.*, c.*
from aws_complianceitem ac
inner join aws_instanceinformation ai 
    on ai.resourceid = ac.resourceid
inner join configinstancestate c
    on c.resourceid = ac.resourceid and c.ipaddress = ac.ipaddress
Run Code Online (Sandbox Code Playgroud)