мы можем получить как «новую запись» в колонке «изменено» для au_id, который не присутствует в одной таблице, и присутствуют в другой таблицеИскомое предложение по запросу
CREATE TABLE authors
(
au_id VARCHAR (100),
au_lname VARCHAR (100),
au_fname VARCHAR (100),
phone VARCHAR (100),
address VARCHAR (100),
city VARCHAR (100),
state VARCHAR (100),
zip VARCHAR (100),
[contract] VARCHAR (100)
)
INSERT authors
SELECT '1', 'address', 'KALIA','29' ,'Second Avenue' , '9',' Second', 'Avenue','LALQUILA' UNION ALL
SELECT '2', 'address', 'WALIA','279' ,'Hague Way', '79', 'Hague', 'Way','QUTUBMINAR' UNION ALL
SELECT '3', 'address', 'TOLIA','269', 'East Hague Street','69', 'East', 'Hague','Street'
SELECT * FROM authors
CREATE TABLE authorsCopy
(
au_id VARCHAR (100),
au_lname VARCHAR (100),
au_Fname VARCHAR (100),
phone VARCHAR (100),
address VARCHAR (100),
city VARCHAR (100),
state VARCHAR (100),
zip VARCHAR (100),
[contract] VARCHAR (100)
)
INSERT authorsCopy
SELECT '1', 'address', 'KALIA','29' ,'Second CHAIBASA' , '9',' Second', 'Avenue','LALQUILA' UNION ALL
SELECT '2', 'address', 'WALIA','279' ,'Hague Way', '79', 'Hague', 'Way','QUTUBMINAR' UNION ALL
SELECT '3', 'address', 'TOLIA', '269', 'East Hague Street','69', 'East', 'Hague','Street' UNION ALL
SELECT '4', 'address', 'MIR', '279' ,'TATANAGAR', '79', 'Hague', 'Way','QUTUBMINAR' UNION ALL
SELECT '5', 'address', 'WANGDU', '269', 'GHATSILA','69', 'East', 'Hague','Street'
SELECT * FROM authorsCopy
DECLARE @temp TABLE(au_id VARCHAR(11) PRIMARY KEY) /*this holds the primary keys of rows that have changed */
INSERT INTO @Temp(au_ID) --determine which rows have changed
SELECT au_ID
FROM --use the EXCEPT technique qhich is the quickest in our tests
(
SELECT au_id, au_lname, au_fname, phone, [address], city, state, zip, [contract]
FROM authors
EXCEPT
SELECT au_id, au_lname, au_fname, phone, address, city, state, zip, contract
FROM authorsCopy
)f--now we just SELECT those columns that have changed
SELECT lefthand.au_id,lefthand.name,lefthand.value AS original,Righthand.value AS changed
FROM (--now we just lay out the two tables as key value pairs, using the string versions of the data
SELECT authors.au_id, 'au_lname' AS 'name',au_lname AS 'value'
FROM authors LEFT OUTER JOIN @Temp altered ON altered.au_id=authors.au_id
UNION
SELECT authors.au_id, 'au_fname' AS 'name',au_fname AS 'value'
FROM authors LEFT OUTER JOIN @Temp altered ON altered.au_id=authors.au_id
UNION
SELECT authors.au_id, 'phone',phone
FROM authors LEFT OUTER JOIN @Temp altered ON altered.au_id=authors.au_id
UNION
SELECT authors.au_id, 'address',address
FROM authors LEFT OUTER JOIN @Temp altered ON altered.au_id=authors.au_id
UNION
SELECT authors.au_id, 'City' AS 'name',City AS 'value'
FROM authors LEFT OUTER JOIN @Temp altered ON altered.au_id=authors.au_id
UNION
SELECT authors.au_id, 'State',state
FROM authors LEFT OUTER JOIN @Temp altered ON altered.au_id=authors.au_id
UNION
SELECT authors.au_id, 'zip',zip
FROM authors LEFT OUTER JOIN @Temp altered ON altered.au_id=authors.au_id
UNION
SELECT authors.au_id, 'contract',CONVERT(CHAR(1),contract)
FROM authors LEFT OUTER JOIN @Temp altered ON altered.au_id=authors.au_id) LeftHand
LEFT OUTER JOIN (
SELECT authorsCopy.au_id, 'au_lname' AS 'name',au_lname AS 'value'
FROM authorsCopy LEFT OUTER JOIN @Temp altered ON altered.au_id=authorsCopy.au_id
UNION
SELECT authorsCopy.au_id, 'au_fname',au_fname
FROM authorsCopy LEFT OUTER JOIN @Temp altered ON altered.au_id=authorsCopy.au_id
UNION
SELECT authorsCopy.au_id, 'phone',phone
FROM authorsCopy LEFT OUTER JOIN @Temp altered ON altered.au_id=authorsCopy.au_id
UNION
SELECT authorsCopy.au_id, 'address',address
FROM authorsCopy LEFT OUTER JOIN @Temp altered ON altered.au_id=authorsCopy.au_id
UNION
SELECT authorsCopy.au_id, 'City' AS 'name',City AS 'value'
FROM authorsCopy LEFT OUTER JOIN @Temp altered ON altered.au_id=authorsCopy.au_id
UNION
SELECT authorsCopy.au_id, 'State',state
FROM authorsCopy LEFT OUTER JOIN @Temp altered ON altered.au_id=authorsCopy.au_id
UNION
SELECT authorsCopy.au_id, 'zip',zip
FROM authorsCopy LEFT OUTER JOIN @Temp altered ON altered.au_id=authorsCopy.au_id
UNION
SELECT authorsCopy.au_id, 'contract',CONVERT(CHAR(1),contract)
FROM authorsCopy LEFT OUTER JOIN @Temp altered ON altered.au_id=authorsCopy.au_id) rightHand
ON lefthand.au_ID=righthand.au_ID
AND lefthand.name=righthand.name
WHERE lefthand.value<>righthand.value
можно получить значение, подобное «новой записи» в столбце «изменено» для au_id, которое отсутствует в одной таблице и представлено в другой таблице. может кто-нибудь что-то подскажет. – sqldemon