Различие SQL Server (противоположность пересечения) - PullRequest
12 голосов
/ 16 июля 2010

Поиск простого / наиболее масштабируемого способа сделать «разницу» в SQL Server см. Ниже.alt text

Если вы не можете сказать по картинке, я ищу все, что не находится на перекрестке.

Я видел один способ сделать это:

select * from (      
    (select 'test1' as a, 1 as b)
 union all
  (select 'test2' as a , 2 as b union all select 'test1' as a , 1 as b )
)un group by a,b  having count(1)=1

Но я боюсь, что произойдет, если я буду использовать два больших набора (я не буду запрашивать из константных операторов select '', мойзапросы будут извлекаться из реальных таблиц.)

РЕДАКТИРОВАТЬ:

Возможное решение ...

drop table #temp_a;
drop table #temp_b;

 go


  select * into #temp_a from (
   select 1 as num, 'String' as two, 'int'as three, 'purple' as four union all
   select 2 as num, 'dog' as two, 'int'as three, 'purple' as four union all
   select 3 as num, 'dog' as two, 'int'as three, 'cat' as four ) a 

select * into #temp_b from (
  select 1 as num, 'String' as two, 'decimal'as three, 'purple' as four union all
  select 2 as num, 'dog' as two, 'int'as three, 'purple' as four union all
  select 3 as num, 'dog' as two, 'int'as three, 'dog' as four ) b 





   SELECT IsNull(a.num, b.num) A,IsNull(a.two, b.two) B, IsNull(a.three, b.three) C,                  
      IsNull(a.four, b.four) D 
     FROM #temp_a a 
   FULL OUTER JOIN #temp_b b ON (a.num=b.num AND a.two=b.two and a.three=b.three and a.four=b.four)
    WHERE   (a.num is null or b.num is null  )

РЕЗУЛЬТАТЫ:

1 строка int purple

3 собаки int cat

1 String dec purple

3 собаки int dog

Ответы [ 3 ]

19 голосов
/ 16 июля 2010

Как насчет этого?

SELECT A, B FROM Table1 EXCEPT SELECT A,B FROM Table2
UNION
SELECT A, B FROM Table2 EXCEPT SELECT A,B FROM Table1

Вот пример с методом FULL OUTER JOIN (при условии, что A не имеет значения NULL в обеих таблицах)

SELECT IsNull(Table1.A, Table2.A) a,IsNull(Table1.B, Table2.B) B
FROM Table1 
FULL OUTER JOIN Table2 ON (Table1.A=Table2.A AND Table1.B=Table2.B)
WHERE Table1.A is null or Table2.A is null
12 голосов
/ 08 ноября 2012

Альтернатива:

SELECT A, B FROM Table1 UNION SELECT A,B FROM Table2
EXCEPT
SELECT A, B FROM Table2 INTERSECT SELECT A,B FROM Table1
3 голосов
/ 16 июля 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...