Oracle Почему существует запрос возвращает этот результат - PullRequest
0 голосов
/ 12 марта 2020

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

select main_rule, child_rule from scoredef_detail s where s.main_rule = 515;
1   515 516
2   515 517

select main_rule, child_rule from scoredef_detail_at s where s.main_rule = 515;
1   515 516
2   515 517

Этот запрос возвращает их все выше. Я пытаюсь получить различия. Эти столбцы являются внешними ключами некоторых других таблиц. Может ли это быть связано с записями других таблиц?

select main_rule, child_rule
  from scoredef_detail s
 where exists
 (select main_rule, child_rule
          from scoredef_detail_at sa
         where s.main_rule = sa.main_rule and (s.child_rule <> sa.child_rule));

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 12 марта 2020

Для родительской строки "1" дочерняя строка "2" удовлетворяет условию EXISTS. Для родительской строки "2" дочерняя строка "1" удовлетворяет условию EXISTS. Так что возвращаются обе строки.

1 голос
/ 12 марта 2020

Вы можете использовать full join для получения несоответствий:

select s.*, sa.*
from (select main_rule, child_rule
      from scoredef_detail s
      where s.main_rule = 515
     ) s full join
     (select main_rule, child_rule
      from scoredef_detail_at s
      where s.main_rule = 515
     ) sa
     on sa.main_rule = s.main_rule and sa.child_rule = s.child_rule
where sa.main_rule is null or s.main_rule is null;

Это покажет пары, которые находятся в одной таблице, но не в другой.

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

Причина, по которой исходный запрос не выполнен и, следовательно, возвращает данные, состоит в том, что у вас есть 2 подходящие строки (515, 516) и (515, 517), каждая из которых существует в обеих таблицах. При позиционировании по одному из ваших критериев «s.main_rule = sa.main_rule и (s.child_rule <> sa.child_rule))» возвращает другой. При расположении на s (515, 516) и оценке sa (515, 517) это выражение становится «515 = 515 и 516 <> 517», которое оценивает True, и поэтому предикат EXISTS оценивает true, таким образом, строка выводится. По тому же сценарию. происходит при оценке (515, 517). Запрос @GordonLinoff возвращает то, что вы хотите, потому что, как он говорит, «покажите пары, которые находятся в одной таблице, но не в другой»

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

Другой вариант в Oracle - использовать ключевое слово MINUS и создать два разных запроса, A MINUS B и B MINUS A, например:

with
q1 as (
  -- could be an arbitrarily complex query
  select main_rule, child_rule from scoredef_detail
),
q2 as(
  -- another arbitrarily complex query...columns must match q1
  select main_rule, child_rule from scoredef_detail_at
)
-- Can leave this part untouched
select 'in Q1 but not Q2' as description, q1.* from q1
  minus
select 'in Q1 but not Q2' as description, q2.* from q2
union
select 'in Q2 but not Q1' as description, q2.* from q2
  minus
select 'in Q2 but not Q1' as description, q1.* from q1
/

Этот тип запроса весьма полезен при написании тестовых сценариев ETL, которые сравнивают исходные таблицы с целевыми таблицами, но преобразования являются немного громоздкими для техники полного объединения. Это еще один инструмент для вашего комплекта.

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