日期:2014-05-16  浏览次数:20469 次

一个单表的SQL查询,高手来试功力……
--实时变更日志表
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……

------解决方案--------------------
这条语句是 有D的选D(唯一),没D的里面,有I的选I(唯一),没I的选U(不唯一)

-----------------------------------------------------------------------------------------------
--
--       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)