我正在工作中进行重构,并将一列从一个表移动到另一个表。
有一个表代表一个架子static.connected_shelf
(上面装有物联网设备),
并且有一个表代表设备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
获取它?
答案 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
中寻找。