2015-11-03 2 views
1

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

  • Если запись в одном из присутствующих в других без каких-либо изменений, то в пользовательской колонке «No Change»
  • Если запись присутствует в таблице «старая», но нет в таблице новой, то в пользовательской колонке «Запись удалена»
  • Если запись присутствует в таблице «новый», но нет в таблице старый, то в пользовательской колонке «новая запись»

Declare @old table 
(

BaseVehicle VARCHAR (50), 
BaseVehicleID VARCHAR (50), 
Years   VARCHAR (50), 
Make   VARCHAR (50), 
MakeID  VARCHAR (50) 

) 

INSERT @old 
SELECT '2002 Freightliner FL60', '127640',   '2002',   'Freightliner', '497' UNION ALL 
SELECT '2002 Freightliner FL70', '127641',   '2002',   'Freightliner', '497' UNION ALL 
SELECT '2014 Check', '127979',    '2014',   'BMW', '31' UNION ALL-- Record Deleted 
SELECT '2003 Freightliner FL50', '127655',   '2003',   'Freightliner', '497' UNION ALL 
SELECT '2003 check', 'test',   '2003',   'Freightliner', '497' UNION ALL-- Record Deleted 
SELECT '2003 Freightliner FL70', '127657',   '2003',   'Freightliner', '497' 

Declare @new table 

(


BaseVehicle VARCHAR (50), 
BaseVehicleID VARCHAR (50), 
Years   VARCHAR (50), 
Make   VARCHAR (50), 
MakeID   VARCHAR (50) 

) 

INSERT @new 
SELECT '2014 Jeep Cherokee', '127768',    '2014',   'Jeep', '42' UNION ALL-- New Records 
SELECT '2011 Ford E-250' , '96774',    '2011',   'Ford', '54' UNION ALL-- New Records 
SELECT '2014 BMW Alpina B7L', '127979',    '2014',   'BMW', '31' UNION ALL-- New Records 
SELECT '2002 Freightliner FL60', '127640',   '2002',   'Freightliner', '497' UNION ALL -- No Changes 
SELECT '2002 Freightliner FL70', '127641',   '2002',   'Freightliner', '497' UNION ALL-- No Changes 
SELECT '2003 Freightliner FL50', '127655',   '2003',   'Freightliner', '497' UNION ALL-- No Changes 
SELECT '2003 Freightliner FL70', '127657',   '2003',   'Freightliner', '497' -- No Changes 

и выход должен выглядеть

BaseVehicle, BaseVehicleID, Years, Make,  MakeID ,Message 

2014 Check,  127979,   2014, BMW,   31, Deleted Row 
2003 check,  test,   2003, Freightliner, 497, Deleted Row 
'2014 Jeep Cherokee', '127768','2014','Jeep', '42' ,  New Records 
'2011 Ford E-250' , '96774','2011','Ford', '54' , New Records 
'2014 BMW Alpina B7L', '127979', '2014','BMW', '31',  New Records 
'2002 Freightliner FL60', '127640','2002','Freightliner', '497' , No Changes 
'2002 Freightliner FL70', '127641','2002','Freightliner', '497', No Changes 
'2003 Freightliner FL50', '127655','2003','Freightliner', '497' , No Changes 
'2003 Freightliner FL70', '127657','2003','Freightliner', '497' , No Changes 
+0

Я использую SQL-Server-2008 – Shan

+0

Вместо того, concat use SET операции .. intersect, минус и т. д. –

ответ

1

Добавить 2 вычисляемых столбцов таблиц

Declare @old table 
(
BaseVehicle VARCHAR (50), 
BaseVehicleID VARCHAR (50), 
Years   VARCHAR (50), 
Make   VARCHAR (50), 
MakeID  VARCHAR (50) 
OldRow AS (BaseVehicle+BaseCehicleID+Years+Make+MakeID) 
) 

Declare @new table 
(
BaseVehicle VARCHAR (50), 
BaseVehicleID VARCHAR (50), 
Years   VARCHAR (50), 
Make   VARCHAR (50), 
MakeID   VARCHAR (50) 
NewRow AS (BaseVehicle+BaseCehicleID+Years+Make+MakeID) 
) 

Затем используйте этот запрос

SELECT 
    Old.BaseVehicle 
    ,Old.BaseVehicleID 
    ,Old.Years 
    ,Old.Make 
    ,Old.MakeID 
    ,CASE WHEN New.OldRow IS NULL THEN 'Record Deleted' ELSE 'No Change' END AS NewColumn 
FROM @Old Old 
LEFT OUTER JOIN @New New ON Old.OldRow = New.NewRow 
UNION ALL 
SELECT 
    New.BaseVehicle 
    ,New.BaseVehicleID 
    ,New.Years 
    ,New.Make 
    ,New.MakeID 
    ,'Record Added' AS NewColumn 
FROM @New New 
LEFT OUTER JOIN @Old Old ON New.NewRow = Old.OldRow 
WHERE Old.OldRow IS NULL 
+0

error: Неверное имя столбца «OldRow». – Shan

+0

Вы изменили определения переменных таблицы, как объяснено? – Adish

+0

исправлена ​​ошибка. Спасибо, Adish – Shan

1
Select BaseVehicle,BaseVehicleID,Years,Make,MakeID,'NO CHANGES' 
from 
(
select BaseVehicle,BaseVehicleID,Years,Make,MakeID 
from 
@Old 
intersect 
select BaseVehicle,BaseVehicleID,Years,Make,MakeID 
from 
@new)NO_CHANGE_TABLE 
UNION ALL 
Select BaseVehicle,BaseVehicleID,Years,Make,MakeID,'RECORD DELETED' 
from 
(
select BaseVehicle,BaseVehicleID,Years,Make,MakeID 
from 
@OLD 
EXCEPT 
select BaseVehicle,BaseVehicleID,Years,Make,MakeID 
from 
@new)RECORD_DELETED_TABLE 
UNION ALL 
Select BaseVehicle,BaseVehicleID,Years,Make,MakeID,'NEW RECORD' 
from 
(
select BaseVehicle,BaseVehicleID,Years,Make,MakeID 
from 
@new 
EXCEPT 
select BaseVehicle,BaseVehicleID,Years,Make,MakeID 
from 
@old)NEW_RECORD_TABLE 
+0

интересно, но все 'INTERSECT' возвращают одинаковые строки –

+0

Спасибо anwaar: но я ищу только удаленные записи из старой таблицы и запись No Changes и новые записи из новой таблицы на выходе – Shan

+0

@Shan i вставил неправильный запрос ... последние два пересекаются должно быть минус или более конкретно EXCEPT в SQL сервер. –

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