SQL:从可能位于另一个表中的列中获取值

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

我正在做一个重构工作,我把一个列从一个表移到另一个表。

有一个表代表货架static.connected_shelf(上面有iot设备), 并且有一个代表设备static.iot_devices的表。

现在,有些新设备未安装在货架上,因此,必须将iot_device_type_fk属性从static.connected_shelf移至static.iot_devices

为了防止在我尝试访问此属性时出现争用情况,我需要修改我的查询,因此当它在static.iot_devices中搜索设备类型但该列不存在时(重构器在该环境中尚未发生),测试不会失败,但回到static.connected_shelf并从那里获得价值。

以下是一个非常简单的查询示例:

    query = """SELECT c.pk connected_shelf_fk, i.iot_device_type_fk  device_type_fk, i.pk device_fk
               FROM static.connected_shelf c
               JOIN static.iot_devices i ON c.pk = i.connected_shelf_fk
               WHERE i.pk = %(device_id)s"""
    cursor.execute(query, {'device_id': device_id})

所以在这里,我已经修改了查询,因此它在iot_device_type_fk中查找static.iot_devices。我怎样才能确保如果该表中不存在该列,我将从static.connected_shelf获取它?

python mysql sql refactoring multiple-columns
1个回答
2
投票

我希望该值在两个表中,在表中没有赋值的NULL值。如果是这样:

SELECT c.pk as connected_shelf_fk,
       COALESCE(i.iot_device_type_fk, c.connected_shelf) as iot_device_type_fk,
       i.pk as device_fk,
FROM static.connected_shelf c JOIN
     static.iot_devices i
     ON c.pk = i.connected_shelf_fk
WHERE i.pk = %(device_id)s

如果该列确实不存在,您可以执行以下操作:

SELECT c.pk as connected_shelf_fk,
       (SELECT iot_device_type_fk  -- no alias!
        FROM static.iot_devices i2
        WHERE i2.pk = i.pk
       ) as iot_device_type_fk,
       i.pk as device_fk,
FROM static.connected_shelf c JOIN
     static.iot_devices i
     ON c.pk = i.connected_shelf_fk
WHERE i.pk = %(device_id)s

子查询将首先在iot_device_type_fk中查找iot_devices,然后在connected_shelf中查找。

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