Объедините таблицу с синтетической таблицей, чтобы получить результат, даже если результат запроса пуст - PullRequest
0 голосов
/ 17 мая 2018

У меня есть таблица данных, в которую я хочу выбрать несколько полей, фильтрующих по дате. Если результат пустой, основываясь на sysdate, мне нужно решить, будет ли он в порядке или нет. Чтобы сделать это, я создаю синтетическую таблицу с полем флага, которое, как я ожидаю, будет заполнено в наборе результатов, даже если в моей фактической таблице на эту дату нет данных.

WITH const AS (
 SELECT 
     'NAME 1' AS name,
      (CASE WHEN TO_TIMESTAMP(TO_CHAR(CURRENT_TIMESTAMP, 'HH24:MI:SS'), 'HH24:MI:SS') < TO_TIMESTAMP('01:00:00', 'HH24:MI:SS') THEN 1 ELSE 0 END) AS flag
 FROM
      Data_Table
 UNION
 SELECT
      'ANY NAME' AS name,
       (CASE WHEN TO_TIMESTAMP(TO_CHAR(CURRENT_TIMESTAMP, 'HH24:MI:SS'), 'HH24:MI:SS') < TO_TIMESTAMP('01:00:00', 'HH24:MI:SS') THEN 1 ELSE 0 END) AS flag )
SELECT Data_Table.sysname, const.flag FROM const LEFT OUTER JOIN Data_Table ON Data_Table.sysname = const.name WHERE Data_Table.date=TO_CHAR(sysdate, 'DD-MM-YYYY')

Я ожидаю получить результаты, как показано ниже:

sysname       flag

Name1          1
(null)         1

Но получается пустой результат, если нет данных с этой датой.

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Я вижу проблему в вашем последнем утверждении:

SELECT Data_Table.sysname, const.flag 
  FROM const 
  LEFT OUTER JOIN Data_Table 
    ON Data_Table.sysname = const.name 
 WHERE Data_Table.date=TO_CHAR(sysdate, 'DD-MM-YYYY')-- Here is the problem

Вы выполняете внешнее левое соединение, а затем фильтруете данные, используя условие where, условие where никогда не будет истинным в этом случае.Вам нужно вставить это условие в объединение, чтобы оно не влияло на общий результат:

SELECT Data_Table.sysname, const.flag 
  FROM const 
  LEFT OUTER JOIN Data_Table 
    ON Data_Table.sysname = const.name 
   AND Data_Table.date=TO_CHAR(sysdate, 'DD-MM-YYYY')
0 голосов
/ 17 мая 2018

Вот общий пример. Если я правильно понимаю, вы должны иметь возможность возвращать значение, даже если запрос не возвращает строк:

SELECT table_name FROM all_tables
 WHERE table_name = 'YOUR_TABLE'
UNION ALL
SELECT '1' table_name FROM dual
 WHERE NOT EXISTS
(
SELECT table_name FROM all_tables
 WHERE table_name = 'YOUR_TABLE'
)
/

Результат равен 1, поскольку в моей базе данных нет таблицы с именем YOUR_TABLE. Но если я добавлю правильное имя таблицы, я получу результаты из верхнего запроса. Если нет, то всегда получайте 1 или любое другое значение из второго запроса. Имена таблиц в обоих запросах должны быть одинаковыми. Второй - копия верхнего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...