2015-09-11 2 views
-1

TABLEA имеет столбцы a,b,c,d,e,f,gзапрос для сравнения двух таблиц, если они идентичны говорит таблицы одинаковы, когда они не

TableB имеет столбцы a,b,c,d,e,f,g,i,j,k,l,m,n,o

я хочу увидеть, если данные из TABLEA для колонн a-g идентичен данным из столбцов a tableB в g. Я использую этот запрос,

select a,b,c,d,e,f,g from tableA 
union 
select a,b,c,d,e,f,g from tableB 
except 
select a,b,c,d,e,f,g from tableA 
intersect 
select a,b,c,d,e,f,g from tableB 

Следует отметить, что 'a' это имя как abc_1c, abc_5c, cfg_10x и так далее, и 'b' является date.

Если таблицы идентичны на этих столбцах, они ничего не должны возвращать. Единственная проблема заключается в том, что таблицаA имеет 180576 строк, а tableB имеет 181404 строки. Где я делаю ошибку и как я могу получить то, что хочу?

Благодаря

+0

UNION/КРОМЕ ALL? – jarlh

ответ

1

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

SqlFiddle

(select a,b,c,d,e,f,g, 'tableA' AS [source] from tableA 
except 
select a,b,c,d,e,f,g, 'tableA' from tableB) 
union all 
(select a,b,c,d,e,f,g, 'tableB' AS [source] from tableB 
except 
select a,b,c,d,e,f,g, 'tableB' from tableA); 

или:

(select a,b,c,d,e,f,g from tableA 
UNION ALL 
select a,b,c,d,e,f,g from tableB) 
EXCEPT 
(select a,b,c,d,e,f,g from tableB 
INTERSECT 
select a,b,c,d,e,f,g from tableA); 

Так что, если ни одна строка не возвращается ю e таблицы идентичны.

EDIT:

Вы, вероятно, есть дубликаты в одном из таблиц, попробуйте:

SELECT a,b,c,d,e,f,g, COUNT(*) 
FROM tableB /* or tableA */ 
GROUP BY a,b,c,d,e,f,g 
HAVING COUNT(*) > 1 

Enhanced версию, которая будет обнаруживать дубликаты:

SQLFIDDLE

+0

сначала спасибо. Пробовал оба ваших запроса. Первый дает мне синтаксические ошибки. Второй работает, но возвращает 0 строк, и, как я уже сказал, у них разное количество строк. Что теперь? –

+0

Если вы используете 'DATETIME', убедитесь, что часть времени одинакова, может быть, они меняются в секундах/милисекундах, если так конвертируются в полные дни – lad2025

+0

@viorelmunteanu Нет места для синтаксической ошибки, не могли бы вы вначале вставить сообщение об ошибке? – lad2025

1

, не предполагающие соответствующего столбца может быть пустым, я бы сделал это немного по-другому:

select 'a', a.a,a.b,a.c,a.d,a.e,a.f,a.g 
    , 'b', b.a,b.b,b.c,b.d,b.e,b.f,b.g 
from  tableA a 
full join tableB b 
    on a.a = a.b 
    and a.b = b.b 
    and a.c = b.c 
    and a.d = b.d 
    and a.e = b.f 
    and a.g = b.g 
where a.a is null 
    or b.a is null 

если столбец может быть нулевым, то запрос будет немного сложнее:

coalesce(null,1) = isnull(null,1) одно и то же

вы должны выбрать альтернативу Null, которая не может быть в этом столбце

если числовой столбец не может быть ниже 0, вы можете написать coalesce(null,-1)

, если вы выбираете строку, вам придется бросить номер первого

select a = coalesce(a.a,b.a)  
    , b = coalesce(a.b,b.b) 
    , c = coalesce(a.c,b.c) 
    , 'a', a.a,a.b,a.c 
    , 'b', b.a,b.b,b.c 
from  tableA a 
full join tableB b 
    on a.a = b.a 
    and coalesce(upper(a.b),'null') = coalesce(upper(b.b),'null') 
    and coalesce(  a.c , -1 ) = coalesce(  b.c , -1 ) 
where a.a is null 
    or b.a is null 
order by coalesce(a.a,b.a) 
     , coalesce(a.b,b.b) 
     , coalesce(a.c,b.c) 
+0

Что делать, если у меня есть нулевые значения в столбце. Не весь столбец. Скажем 2000 из 180 k? (Becasue i do) –

+0

@viorelmunteanu добавила версию с нулями –

Смежные вопросы