Результат выборки из Oracle дБ - PullRequest
0 голосов
/ 03 марта 2020

У меня есть таблица частоты таблицы БД следующим образом (companyid, task и частоты), уникальный ключ

 | companyid| task  |frequency | date        |
 | -------- | ----- | -------  | -----       |
 | 123      | abc   | Day      | 03-03-2020  |
 | 123      | def   | Week     | 09-03-2020  |
 | 456      | abc   | Week     | 10-03-2020  |
 | 456      | klm   | Week     | 12-03-2020  |

Таблица истории следующим образом PRIMARY KEY ("companyid", "RECORDNO")

| companyid| RECORDNO | STAGE    |  STATE |
| -------- | -----    | -------  |  ----- | 
| 123      | 12       | 1        |    P   |
| 456      | 13       | 2        |    A   |
| 123      | 13       | 1        |    S   |

Таблица ввода, уникальная («companyid», «ID»)

| companyid| ID       | STATE       |  task    |
| -------- | -----    | -----       |  -----   |
| 123      | 12       | Purchased   |  abc     |
| 123      | 13       | Accesible   |  def     |
| 456      | 13       |  Store      |  abc     |
| 456      | 14       |  Store      |  klm     |

Я выполняю задание, которое часто запускается каждые 6 часов. Мне нужно выбрать уникальные идентификаторы компаний, для которых состояние в таблице истории равно 'S', и задание в частоте = задача в таблице записей, а запись - это таблица истории = идентификатор в таблице записей, а текущая системная дата больше, чем дата в таблице частот. .

Основным требованием c является обработка задания (записей из таблицы записей), в котором дата меньше текущей системной даты. (Обратите внимание, что системная дата всегда указывается в UT C, а дата в таблице частот может быть настроена пользователем). companyid распространен во всех таблицах.

Я пробовал приведенный ниже запрос, чтобы получить результат без фильтров даты. Нужна помощь в получении фильтра времени правильно.

select distinct cny# 
from frequency 
where exists 
  (select 1 
   from history, entry  
   where history.companyid = entry.companyid 
   and history.state='S' 
   and history.record# = entry.id);

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

Разве это не простое объединение трех таблиц?

select distinct e.company_id
from entry e 
join history h on h.companyid = e.companyid and h,recordno = e.id
join frequency f on f.companyid = e.companyid and f.task = e.task
where f.date < trunc(sysdate)
and h.state = 'S';

или с критериями в предложениях ON:

select distinct e.company_id
from entry e 
join history h on h.companyid = e.companyid and h,recordno = e.id and h.state = 'S'
join frequency f on f.companyid = e.companyid and f.task = e.task and f.date < trunc(sysdate)
;

Обычно, однако, вы ' у меня есть стол компании, поэтому вам не понадобится DISTINCT:

select * from company where companyid in (select e.companyid from ...);
0 голосов
/ 03 марта 2020

Вы можете использовать функцию oracle sysdate, чтобы получить текущую дату и время сервера базы данных и использовать ее в запросе.

select distinct companyid 
from frequency 
where exists 
  (select 1 
   from history, entry  
   where history.companyid = entry.companyid 
   and history.state='S' 
   and history.recordno = entry.id)
and sysdate > to_date(date,'DD-MM-YYYY');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...