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

时间:2019-04-22 11:06:22

标签: python mysql sql refactoring multiple-columns

我正在工作中进行重构,并将一列从一个表移动到另一个表。

有一个表代表一个架子static.connected_shelf(上面装有物联网设备),
并且有一个表代表设备static.iot_devices

现在,有一些新设备尚未安装在架子上,因此必须将属性iot_device_type_fkstatic.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获取它?

1 个答案:

答案 0 :(得分: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中寻找。