Запрос Vertica явно показывает несуществующие записи

Я знаю, это звучит странно, но я ищу способ заставить Vertica показывать индикатор, когда записи на самом деле не существует - возможно, это проще понять на примере.

Давайте представим, что я хочу найти в таблице наличие 3 записей, каждая из которых имеет уникальный ключ job_id: (100,200,300) , и я хочу получить некоторые другие поля для той же записи, например временную метку или что-то еще...

Я бы сделал что-то вроде этого:

vsql> select job_id, date from my_table where job_id in (100,200,300);

Если есть только записи для 100 и 300, результат должен быть примерно таким:

 job_id |     date
--------+---------
    100 | 01/01/01
    300 | 03/03/03

Что я хотел бы получить в результате:

 job_id |     date
--------+---------
    100 | 01/01/01
    200 | 
    300 | 03/03/03

Почему? Потому что я хочу добавить данные из других источников в вывод запроса, и этот источник учитывает все job_id, даже если для него нет записей в my_table.

Я знаю, что вы можете JOIN таблицу с самой собой, но в данном случае это не сработало, потому что ни в одной из таблиц (одной и той же, черт возьми) нет отсутствующей записи. Таким образом, эта проблема выглядит как нечто, что предотвращается дизайном, но мне интересно, была ли у кого-то такая же потребность. Заранее спасибо.


person jimm-cl    schedule 12.12.2015    source источник
comment
Где вы собираетесь хранить job_id, которых нет в вашем левом наборе? Я бы заполнил их в таблице и присоединился к ним, или для небольшого количества заданий использовал ответ lad2025 ниже.   -  person Kermit    schedule 12.12.2015
comment
Ваши значения job_id предсказуемы? Всегда ли они увеличиваются с шагом 100?   -  person Dave Poole    schedule 11.08.2017


Ответы (1)


Вы можете использовать LEFT JOIN и подзапрос:

SELECT sub.job_id,
       m.date, 
       CASE WHEN m.job_id IS NULL THEN 0 ELSE 1 END AS indicator
FROM (SELECT 100 AS job_id
      UNION ALL SELECT 200 
      UNION ALL SELECT 300) AS sub
LEFT JOIN my_table m
  ON sub.job_id = m.job_id;

LiveDemo

Я не знаю Vertica, но в SQL Sever вы можете изменить подзапрос с помощью:

  • VALUES
  • выбрать из временной таблицы
  • выбрать из табличной переменной/табличного параметра
person Lukasz Szozda    schedule 12.12.2015