SQL: получить значение из столбца, который может быть в другой таблице - PullRequest
0 голосов
/ 22 апреля 2019

Я работаю над рефакторингом и перенес столбец из одной таблицы в другую.

Существует таблица, представляющая полку 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?

1 Ответ

2 голосов
/ 22 апреля 2019

Я ожидаю, что значение будет в обеих таблицах, с 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.

...