可以在没有主键的情况下连接两个表吗?

问题描述 投票:0回答:1

我在 Snowflake 中有两张表,一张由用户 logins(失败、成功等)组成,另一张表由 device 信息(移动、网络、iOS 等)组成。这些表包含 user_id 和时间戳字段,但是,没有主键可以轻松地将两个表连接在一起。

目前,我正在尝试加入 user_id 和模糊时间戳匹配,以了解给定登录使用了哪个设备。然而,这是一种将表连接在一起的昂贵且低效的方法,并且经常导致查询超时。

有没有办法在两个表中创建一个主键,然后我可以用它来连接?

我尝试加入 user_id 和模糊时间戳,但这不可扩展。

select *
from logins l
left join devices d 
on d.party_id = l.party_id
and timestampdiff(second, l.login_dt::timestamp, d.device_dt::timestamp) >= 0
and timestampdiff(second, l.login_dt::timestamp, d.device_dt::timestamp) <= 10
sql data-analysis primary-key
1个回答
0
投票

这可能会有所帮助。使用横向连接允许仅匹配设备表中最近的单行:

SELECT l.*, d.*
FROM logins l
LEFT JOIN LATERAL (
    SELECT *
    FROM devices d
    WHERE d.party_id = l.party_id
    AND  d.device_dt >= l.login_dt
    -- include further logic if required
    ORDER BY d.device_dt::timestamp
    LIMIT 1
) d ON TRUE;

现在,如果您在设备表中有(或添加)一个 id 列,您将看到结果中返回该 id。由此,您可以将该值作为“device_id”包含到登录表中。对 id 和 device_id 列建立索引。

© www.soinside.com 2019 - 2024. All rights reserved.