2010-07-15 5 views
7

Ищите облегченный/наиболее масштабируемый способ выполнения «разницы» в SQL Server, см. Ниже. alt textРазница SQL Server (напротив пересечения)

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

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

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 

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

EDIT:.

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

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 Строка ИНТ фиолетового

3 собаки ИНТ кошка

1 Строка Декабрь фиолетовой

3 собаки ИНТ собака

ответ

15

Как о чем-то вроде этого ?

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 метода (при условии, не обнуляемое в обеих таблицах)

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 
+0

Что делает IsNull часть достичь? Это просто средство «показать» то, чего не хватает? – Nix

+1

Для строк, у которых есть только запись в одной из таблиц (те, которые вы хотите), будет нуль в одной таблице или другой. Например, либо Table1.A будет null, либо Table2.A будет нулевой для каждой строки. Isnull захватывает значение с той стороны, которая имеет значение. – JohnFx

5

Что вы после этого называется Full Outer Join, which SQL Server supports.

+0

Я изначально думал примерно так: выберите * from (выберите 'test1' как a, 1 as b) One ПОЛНОЕ СОЕДИНЕНИЕ (выберите 'test2' как a, 2 as b union all выберите 'test1' как a, 1 как b) Два \t ON One.a <> Two.a AND One.b <> Two.b Однако это не (запустите оба SQL) –

+1

да, но вы также должны отфильтровать все совпадения после join: 'WHERE keyA NULL ИЛИ keyB is NULL' –

+1

Полное внешнее соединение НЕ является тем, о чем спрашивает вопрос. Полное внешнее соединение было бы полностью заполненной диаграммой Венна, а не только непересекающимися частями диаграммы Венна. – Dogs

9

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

SELECT A, B FROM Table1 UNION SELECT A,B FROM Table2 
EXCEPT 
SELECT A, B FROM Table2 INTERSECT SELECT A,B FROM Table1 
Смежные вопросы