没有键列的两个表的差异

时间:2015-11-03 14:11:10

标签: sql sql-server database sql-server-2008

我有两个没有密钥的表,我需要连接所有列而不需要检查三个条件,因为表缺少键列。

  • 如果在其他位置记录,没有任何更改,则在自定义列“无变化”
  • 如果记录显示在表'old'中但在表new中不存在,则在自定义列“Record deleted”
  • 如果记录显示在表格中“新”但在表格中不存在,则在自定义列“新记录”
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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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