Выберите обе стороны оператора Минус - PullRequest
0 голосов
/ 03 октября 2018

Я хочу найти разницу в именах таблиц каждого владельца для обеих сторон минус-запроса.

Скажем, у меня есть 2 оператора select из таблицы, и я хочу сравнить их как таковые:

Select1:

SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'alpha';  

Select2:

SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'charlie';

Скажем, у таблицы альфы есть имена таблиц: a, b, c, а у таблицы Чарли есть имена таблиц b, c.

Если я сделаю

(SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'alpha') minus    
SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'charlie';    

Это даст мне ожидаемый результат: a.

И наоборот, если я сделаю обратное:

  (SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'charlie') minus    
SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'alpha';    

Это даст мнеожидаемый результат: пустая строка.

Теперь, если мне нужно и имя таблицы 'a', и пустую строку, которую я выполняю:

(SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'alpha') minus 
SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'charlie'
  Union
(SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'charlie') minus 
SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'alpha';

, тогда я ничего не получу.

Как бы вернуть строку 'a' и пустую строку вместе?Я использую Oracle DB

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

просто используйте скобки после объединения

(SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'alpha') minus 
SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'charlie'

  Union
(
(SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'charlie') minus 
SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'alpha'
)

пример

with t1 as
(
select 62054 as  sample_id,'2018-09-25 10:18:15' as timestamp,2652 as p_id from dual
union all
select 62054 as  sample_id,'2018-09-27 16:44:57' as timestamp,966 as p_id from dual
union all
select 62046 as  sample_id,null ,1809 as p_id from dual
union all
select 62046 , '018-09-25 10:18:15' ,2097  from dual



) select * from t1 where p_id=2652
 minus
 select * from t1 where p_id=966
 union

 select * from t1 where p_id=2652
 minus
 select * from t1 where p_id=2652

вышеприведенное вернет ноль, но

with t1 as
(
select 62054 as  sample_id,'2018-09-25 10:18:15' as timestamp,2652 as p_id from dual
union all
select 62054 as  sample_id,'2018-09-27 16:44:57' as timestamp,966 as p_id from dual
union all
select 62046 as  sample_id,null ,1809 as p_id from dual
union all
select 62046 , '018-09-25 10:18:15' ,2097  from dual



) select * from t1 where p_id=2652
 minus
 select * from t1 where p_id=966
 union
(
 select * from t1 where p_id=2652
 minus
 select * from t1 where p_id=2652
 )

вышеприведенное вернет ниже

SAMPLE_ID   TIMESTAMP   P_ID
62054   2018-09-25 10:18:15 2652
0 голосов
/ 03 октября 2018

Кажется, что вы хотите UNION MINUS INTERSECT, если вы понимаете, о чем я?Вычислите объединение, вычислите пересечение и сделайте MINUS между этими двумя наборами результатов (используя соответствующие скобки, в которых ваши текущие усилия терпят неудачу, потому что UNION и MINUS имеют одинаковый приоритет)

(SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'alpha' UNION 
SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'charlie')
MINUS
(SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'charlie' INTERSECT
SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'alpha');

Это, я полагаю, правильно отражает то, что вы логически просите. Ответ Зайнул Абадина Тухина касается немедленного вопроса.Но я верю, что ваши усилия (и их исправление) затеняют намерение здесь.

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