Oracle SQL - 2 запроса, которые объединяют 3 таблицы и разделяют список без наложения - PullRequest
0 голосов
/ 01 июня 2018

У меня есть 3 таблицы

Таблица 1 Список пользователей, имеющих право на участие в этой программе. Имеет поле CUSTOMER_ID.Этот список содержит несколько записей на пользователя , и все они должны быть включены в окончательные списки, описанные ниже.

Таблица 2 (b) - список наиболее(но не все) пользователи и лучшие времена, чтобы связаться с ними.Он имеет поля:

  • USER_ID
  • ПОНЕДЕЛЬНИК
  • ВТОРНИК
  • СРЕДА
  • ЧЕТВЕРГ
  • ПЯТНИЦА
  • СУББОТА
  • ВОСКРЕСЕНЬЕ

Таблица 3 - это основной список всех пользователей, который имеет поля:

  • USER_ID
  • CUSTOMER_ID

Мне нужно разделить таблицу 1 на 2 списка:

Список 1 должен быть всеми пользователями (ивсе строки на пользователя) в таблице 1, которые:

  • имеют значение в сегодняшнем поле, которое находится в пределах диапазона в таблице 2

(т. е. если сегодня понедельник, включите всепользователи из Таблицы 1, которые имеют значение между 6 и 23 в поле понедельника из Таблицы 2)

Это то, что у меня есть для первого списка, который, кажется, работает:

SELECT b.USER_ID, b.monday, b.tuesday, b.wednesday, b.thursday, 
b.friday, b.saturday, b.sunday FROM $A$ a, $C$ c, $B$ b 
WHERE ( 
TO_CHAR(sysdate, 'D') = 1 AND (b.sunday >= 6 AND b.sunday <= 23) OR 
TO_CHAR(sysdate, 'D') = 2 AND (b.monday >= 6 AND b.monday <= 23) OR 
TO_CHAR(sysdate, 'D') = 3 AND (b.tuesday >= 6 AND b.tuesday <= 23) OR 
TO_CHAR(sysdate, 'D') = 4 AND (b.wednesday >= 6 AND b.wednesday <= 23) OR 
TO_CHAR(sysdate, 'D') = 5 AND (b.thursday >= 6 AND b.thursday <= 23) OR 
TO_CHAR(sysdate, 'D') = 6 AND (b.friday >= 6 AND b.friday <= 23) OR 
TO_CHAR(sysdate, 'D') = 7 AND (b.saturday >= 6 AND b.saturday <= 23) ) 
AND (c.USER_ID = b.USER_ID AND a.CUSTOMER_ID_ = c.CUSTOMER_ID_) 

Список 2 должен включать всех пользователей (и все строки на пользователя) в таблице 1, которые:

  • имеют нулевое значение в сегодняшнем поле в таблице 2
  • имеют значениевне диапазона (т.е. не между 6& 23)
  • В Таблице 2 вообще нет

У меня есть 2 запроса для списка 2, и я не уверен, как их объединить.

Количество записей по этим трем запросам, которые я получаю, больше, чем исходный список, поэтому определенно происходит некоторое совпадение.

Может кто-нибудь подсказать, как мне написать этот второй запрос?

1 Ответ

0 голосов
/ 01 июня 2018

SQL Fiddle

Настройка схемы Oracle 11g R2 :

CREATE TABLE table1 ( CUSTOMER_ID ) AS
SELECT 1 FROM DUAL UNION ALL
SELECT 2 FROM DUAL;

CREATE TABLE table2 (
  USER_ID,
  MONDAY,
  TUESDAY,
  WEDNESDAY,
  THURSDAY,
  FRIDAY,
  SATURDAY,
  SUNDAY
) AS
SELECT 1, 2, 3, 4, 5, 6, 7, 8 FROM DUAL;

CREATE TABLE table3 ( USER_ID, CUSTOMER_ID ) As
SELECT 1, 1 FROM DUAL UNION ALL
SELECT 2, 2 FROM DUAL;

Запрос 1 :

SELECT b.USER_ID, 
       b.monday,
       b.tuesday,
       b.wednesday,
       b.thursday, 
       b.friday,
       b.saturday,
       b.sunday
FROM   table1 a
       INNER JOIN table3 c
       ON ( a.CUSTOMER_ID = c.CUSTOMER_ID )
       INNER JOIN table2 b 
       ON ( c.USER_ID = b.USER_ID )
WHERE  CASE TRUNC( SYSDATE ) - TRUNC( SYSDATE, 'IW' )
       WHEN 0 THEN b.Monday
       WHEN 1 THEN b.Tuesday
       WHEN 2 THEN b.Wednesday
       WHEN 3 THEN b.Thursday
       WHEN 4 THEN b.Friday
       WHEN 5 THEN b.Saturday
       WHEN 6 THEN b.Sunday
       END                      BETWEEN 6 AND 23

Результаты :

| USER_ID | MONDAY | TUESDAY | WEDNESDAY | THURSDAY | FRIDAY | SATURDAY | SUNDAY |
|---------|--------|---------|-----------|----------|--------|----------|--------|
|       1 |      2 |       3 |         4 |        5 |      6 |        7 |      8 |

Запрос 2 : Похоже, вы просто хотите LEFT OUTER JOIN.

SELECT c.USER_ID, 
       b.monday,
       b.tuesday,
       b.wednesday,
       b.thursday, 
       b.friday,
       b.saturday,
       b.sunday
FROM   table1 a
       INNER JOIN table3 c
       ON ( a.CUSTOMER_ID = c.CUSTOMER_ID )
       LEFT OUTER JOIN table2 b 
       ON ( c.USER_ID = b.USER_ID )
WHERE  b.USER_ID IS NULL
OR     NOT (
         CASE TRUNC( SYSDATE ) - TRUNC( SYSDATE, 'IW' )
         WHEN 0 THEN b.Monday
         WHEN 1 THEN b.Tuesday
         WHEN 2 THEN b.Wednesday
         WHEN 3 THEN b.Thursday
         WHEN 4 THEN b.Friday
         WHEN 5 THEN b.Saturday
         WHEN 6 THEN b.Sunday
         END                      BETWEEN 6 AND 23
       )
OR     CASE TRUNC( SYSDATE ) - TRUNC( SYSDATE, 'IW' )
       WHEN 0 THEN b.Monday
       WHEN 1 THEN b.Tuesday
       WHEN 2 THEN b.Wednesday
       WHEN 3 THEN b.Thursday
       WHEN 4 THEN b.Friday
       WHEN 5 THEN b.Saturday
       WHEN 6 THEN b.Sunday
       END                        IS NULL

Результаты :

| USER_ID | MONDAY | TUESDAY | WEDNESDAY | THURSDAY | FRIDAY | SATURDAY | SUNDAY |
|---------|--------|---------|-----------|----------|--------|----------|--------|
|       2 | (null) |  (null) |    (null) |   (null) | (null) |   (null) | (null) |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...