日期:2014-05-16 浏览次数:20510 次
--实时变更日志表
IF OBJECT_ID('sync_log') IS NOT NULL
BEGIN
DROP TABLE sync_log
END
GO
CREATE TABLE [dbo].sync_log(
[id] [bigint] PRIMARY KEY IDENTITY(1,1) NOT NULL,
[tableName] VARCHAR(300) NOT NULL,
[pkName] VARCHAR(200) NOT NULL,
[pkValue] VARCHAR(200) NOT NULL,
[opType] CHAR(1) NOT NULL,
[createTime] DATETIME NOT NULL DEFAULT(GETDATE()),
[finished] BIT NOT NULL DEFAULT(0),
[finishedTime] DATETIME
) ON [PRIMARY]
GO
--添加测试记录
DECLARE @i INT,@iMax INT,@maxId INT
SELECT @i=1,@iMax = 10000
WHILE @i<=@iMax
BEGIN
INSERT INTO jxpt.dbo.T1 (NAME,[desc]) SELECT 'n'+CAST (@i AS VARCHAR),'d'+CAST (@i AS VARCHAR)
SELECT @maxId = MAX(id) FROM T1 t
IF @maxId%2=0
BEGIN
UPDATE t1 SET t1.name=t1.name+'%2' WHERE id=@maxId
END
IF @maxId%7=0
DELETE FROM t1 WHERE id=@maxId
SET @i=@i+1
END
UPDATE dbo.sync_log SET finished = 1 WHERE id<=5
--要求:
--题A:
--1. 同一tableName,同一pkName的数据按id排序仅取最后的一个。
--2. finished = 0
--3. 按id排序 ASC, 前一千条数据
SELECT TOP 1000 * FROM sync_log sl
WHERE exists (
SELECT 1 FROM sync_log s WHERE s.finished=0
GROUP BY s.tableName,s.pkName,s.pkValue
HAVING sl.id=MAX(s.id)
)
ORDER BY sl.id
--题B:
--前提 opType 只包含 'I','U','D' 三种情况
--在题A的基础上,将题A的条件 1 稍作修改,其它条件不变。
--1. 同一tableName, 同一pkName的数据据,如果有多条记录,而且存在opType是'D'的,仅取为'D'的那条记录;
--2. 同一tableName, 同一pkName的数据据,如果有多条记录,而且不存在opType是'D'的,如果存在'I'的仅取'I'那条记录
--3. 同一tableName, 同一pkName的数据据,如果有多条记录,而且不存在opType是'D'的,如果不存在'I'的, 取最后一条记录
--题A已做, 哪位有兴趣可以做下题B……
-----------------------------------------------------------------------------------------------
--
-- By Jorkin http://Jorkin.ME
--
-----------------------------------------------------------------------------------------------
SELECT TOP 1000 *
FROM sync_log sl
WHERE EXISTS (SELECT 1
FROM sync_log s
WHERE s.finished = 0
GROUP BY s.tableName,
s.pkName,
s.pkValue
HAVING sl.optype = Min(s.optype)