但是理论上是可以实现的。至少我会用程序来判断。比如最笨的办法是对每个record循环,判断有无空的Replaced。没有的话就加入到deleted的列表。我只是想用SQL来实现,这样效率高。可能用到group,having,coalesce等命令。但组合起来用我就不是很熟了。

解决方案 »

  1.   

    其实就是针对你的一个数据表提供一个操作日志表.也即一个oprateLog
    可以用trigger实现. 
    但有前提, 你的数据表中要有主健.
    oprateLog表中要有列关联到你的数据表的主健列. 也不一定是非要建关联关系, 但一定要进行这样的关联设计,否则按你现在的结构没法实现.不知道我有没有理解你的意思.
      

  2.   

    update和delete区别的方法有几种
    1,可以用 if update...来区别. 
    2,有无产生inserted逻辑表,或可访问,或有数据
    3,原表中记录数(这个准确度较差)
      

  3.   

    表格有主键。时间是我自己瞎写的。应该按照时间升序排列。请问4楼如何用trigger实现。
      

  4.   

    --删除的记录
    select distinct Record from 表 a
    where not exists (select 1 from 表 where Record=a.Record and Replaced is null)--更新过的记录
    select distinct Record from 表 a
    where exists (select 1 from 表 where Record=a.Record and Replaced is null)
    and exists (select 1 from 表 where Record=a.Record and Replaced is not null)--没更新过的记录
    select distinct Record from 表 a
    where not exists (select 1 from 表 where Record=a.Record and Replaced is not null)
      

  5.   

    随便写了个tb和oprateLog还有个trigger给你.可以看看后面的测试操作.查看tb表和log表
    declare @t table(id int identity(1,1), v varchar(10))
    insert @t select 'a'
    USE test
    GO
    CREATE TABLE tb(id INT IDENTITY(1,1),v VARCHAR(10))
    GO
    CREATE TABLE oprateLog(lid INT IDENTITY(1,1),sourceID INT NOT NULL,createTime DATETIME NOT NULL DEFAULT GETDATE(),modifyOrDelTime DATETIME NULL,method TINYINT NOT NULL DEFAULT 0)
    GO
    CREATE TRIGGER testLog ON tb
    FOR INSERT,UPDATE,DELETE
    AS
    --INSERT
    IF EXISTS(SELECT 1 FROM INSERTED) AND NOT EXISTS(SELECT 1 FROM DELETED)
    INSERT oprateLog(sourceID) SELECT id FROM INSERTED
    --UPDATE
    IF UPDATE(v)
    UPDATE o SET modifyOrDelTime=GETDATE(),method=1
    FROM oprateLog o
    INNER JOIN deleted d
    ON id=sourceid
    --DELETE
    IF EXISTS(SELECT 1 FROM DELETED) AND NOT EXISTS(SELECT 1 FROM INSERTED)
    UPDATE o SET modifyOrDelTime=GETDATE(),method=2
    FROM oprateLog o
    INNER JOIN deleted d
    ON id=sourceid
    GO--TRUNCATE TABLE tb
    --TRUNCATE TABLE oprateLog
    INSERT tb SELECT 'a'
    INSERT tb SELECT 'b'
    SELECT * FROM oprateLog
    UPDATE tb SET v='x' WHERE id=1
    SELECT * FROM oprateLog
    DELETE FROM tb WHERE id=2
    INSERT tb SELECT 'c'
    SELECT * FROM oprateLog
    SELECT * FROM tb
    GO
      

  6.   

    小楼在3楼问楼主的是他的log表怎么来区分delete和update吧, 我理解错了,不好意思.
      

  7.   

    这么快有这么多回复。都是SQL高手啊。我虽然自己很欣赏fcuandy的方法,简单易行。但是如果表很大,而且结构一直要改动,有时候就不能保证所有记录都准确无误地记录下来。当然任何方法都不能做到完全准确。Limpire的办法比较可行:
    --删除的记录
    select distinct Record from 表 a
        where not exists (select 1 from 表 where Record=a.Record and Replaced is null
      

  8.   

    嗯,加method字段合理多了。有了method,createTime和modifyOrDelTime,一个就行了——OperationTime——个人认为:)
      

  9.   


    刚才进一步测试,全部通过。太感激了。加Method column是一个好方法。要不是现在的设计已经定了下来,我们会认真考虑。毕竟SQL要简单很多啊。既然现在所有问题已经解决,虽然增加了一些SQL工作量,这样的设计表结构可以做到最简单,还是不错的一个方案。好像这个帖子介绍3种方法了,不错哦。用trigger和Log表的方法,我以前用过,到现在还是认为有明显的优点。所以我都会加分。呵呵。