Отфильтруйте идентичные строки od данных на основе критериев множественности, чтобы показать только выбросы - PullRequest
0 голосов
/ 19 марта 2020

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

У меня есть 2 набора данных, которые я пытаюсь каким-то образом объединить, чтобы он возвращал только записи выбросов (где нет матч). Я думал об использовании UNION и EXCEPT, но, похоже, он не работает с этим сценарием. Чтобы сделать это менее сложным, у меня в настоящий момент есть два CTE в моем pro c (в качестве альтернативы я могу использовать #TempTables).

Результат запроса 1. В приведенном ниже наборе результатов этот запрос вернет 3 поля. Текстовое значение Field3 здесь всегда будет одинаковым.

 Field1         Field2        Field3
 123            BAK           'Missing in Query 2'
 234            HAO           'Missing in Query 2'
 345            OPP           'Missing in Query 2'

Результат запроса 2. То же самое здесь, Field3 всегда будет иметь одинаковое текстовое значение.

 Field1         Field2        Field3
 123            BAK           'Missing in Query 1'
 234            HAO           'Missing in Query 1'
 678            UTO           'Missing in Query 1'

Желаемый результат: причина почему эти два возвращаются в первой строке (поле 345), отсутствует в запросе 2, а вторая строка отсутствует в запросе 1. Я ищу только совпадения, где Query1.Field1 = Query2.Field1 и Query1.Field2 = Query2. Field2.

  Field1         Field2        Field3
  345            OPP           'Missing in Query 2'   <- from Query 1
  678            UTO           'Missing in Query 1'   <- from Query 2

Я пытался использовать FULL JOIN для этого, но FULL JOIN возвращает дополнительные 3 столбца со значениями NULL. Я пытаюсь избежать этого и отображать только результат, как показано выше. Любая помощь будет оценена.

Ответы [ 2 ]

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

Вы можете использовать full outer join:

select coalesce(qr1.field1, qr2.field1) as field1,
       coalesce(qr1.field2, qr2.field2) as field2,
       (case when qr1.field1 is null 
             then 'Missing in Query 1'
             else 'Missing in Query 2'  
        end) as Field3
from qr1 full outer join
     qr2
     on qr1.field1 = qr2.field1 and qr1.field2 = qr2.field2
where (qr1.field1 is null or qr2.field2 is null);
1 голос
/ 19 марта 2020

Я думаю, вам нужны строки, которых нет в обеих таблицах. Один из методов:

select qr1.*
from qr1
where not exists (select 1 from qr2 where qr2.field1 = qr1.field1 and qr2.field2 = qr1.field2)
union all
select qr2.*
from qr2
where not exists (select 1 from qr1 where qr1.field1 = qr2.field1 and qr1.field2 = qr2.field2);
...