none
寻找重复项 RRS feed

  • 问题

  •     在ContractTable (合同表)中我设置了Cid(自动增长1)、ContractID(资产号)、PerformState(合同履行的状态)、ContractType(合同类型)。

        那么我现在要查询目前有多少合同正在履行,就通过代码1来显示。但有时候可能我在操作过程中对于的PerformState、ContractType的条件没有及时修改,造成同一个资产号下(ContractID)有两个合同(Cid)同时在履行,也就是一一对应。

        因此,本来我有100个资产,应该对应100份正在履行的租赁合同,现在变成了100个资产对应了100多份合同。

        我的基本思路就是找出代码2比代码1多出来的那几个Cid,没有写出理想的代码

    -------------------------------------代码1----------------------------------

    select distinct ContractID  from ContractTable a
    where ContractType ='租赁'
    and a.PerformState ='正在履行'

    -----------------------------------代码2--------------------------------------

    select ContractID  from ContractTable a
    where ContractType ='租赁'
    and a.PerformState ='正在履行'


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2014年4月10日 7:16

答案

  • 您好,

    可以使用Group後,再檢查Count(*)大於1的,就是有重覆的資料,如下,

    select   ContractID  
    from ContractTable a
    where ContractType =N'租赁'
    and a.PerformState =N'正在履行'
    GROUP BY ContractID
    HAVING COUNT(*) > 1

    另外,CTE似乎比較符合您要的,如下,

    CREATE TABLE ContractTable
    (
    Cid INT IDENTITY,
    ContractID NVARCHAR(30),
    PerformState NVARCHAR(30),
    ContractType NVARCHAR(30)
    )
    
    INSERT INTO ContractTable(ContractID, PerformState, ContractType)
    VALUES(N'资产号1', N'正在履行', N'租赁');
    INSERT INTO ContractTable(ContractID, PerformState, ContractType)
    VALUES(N'资产号1', N'正在履行', N'租赁');
    INSERT INTO ContractTable(ContractID, PerformState, ContractType)
    VALUES(N'资产号2', N'正在履行', N'租赁');
    
    --找出重覆的資料
    WITH Duplicates AS 
    (
    SELECT
         Cid,
         ROW_NUMBER() OVER( PARTITION BY ContractID
              ORDER BY ContractID) AS OrderID
    FROM ContractTable
    )
    SELECT * FROM Duplicates
    WHERE OrderID > 1;
    


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    2014年4月10日 9:33

全部回复

  • 您好,

    可以使用Group後,再檢查Count(*)大於1的,就是有重覆的資料,如下,

    select   ContractID  
    from ContractTable a
    where ContractType =N'租赁'
    and a.PerformState =N'正在履行'
    GROUP BY ContractID
    HAVING COUNT(*) > 1

    另外,CTE似乎比較符合您要的,如下,

    CREATE TABLE ContractTable
    (
    Cid INT IDENTITY,
    ContractID NVARCHAR(30),
    PerformState NVARCHAR(30),
    ContractType NVARCHAR(30)
    )
    
    INSERT INTO ContractTable(ContractID, PerformState, ContractType)
    VALUES(N'资产号1', N'正在履行', N'租赁');
    INSERT INTO ContractTable(ContractID, PerformState, ContractType)
    VALUES(N'资产号1', N'正在履行', N'租赁');
    INSERT INTO ContractTable(ContractID, PerformState, ContractType)
    VALUES(N'资产号2', N'正在履行', N'租赁');
    
    --找出重覆的資料
    WITH Duplicates AS 
    (
    SELECT
         Cid,
         ROW_NUMBER() OVER( PARTITION BY ContractID
              ORDER BY ContractID) AS OrderID
    FROM ContractTable
    )
    SELECT * FROM Duplicates
    WHERE OrderID > 1;
    


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    2014年4月10日 9:33
  •     谢谢你的解答,不过有的函数我没学过,还不懂懂,最后计算出来的结果也会显示的少了些东西。

        我找到了一段代码,似乎更合适些,发出来供后来人参考,下面是两段代码及两种结果。再次感谢你!

    WITH Duplicates AS 
    (
    SELECT
         Cid,ContractID,
         ROW_NUMBER() OVER( PARTITION BY ContractID
              ORDER BY ContractID ) AS OrderID
    FROM ContractTable 
    where ContractType ='租赁'
    	and PerformState ='正在履行'
    )
    SELECT * FROM Duplicates
    WHERE OrderID > 1;
    -----------------------------------------------------------
    select
    	CID as c,ContractID
    from ContractTable a 
    where 
    	ContractType ='租赁'
    	and PerformState ='正在履行'
        and exists(
    	select * from ContractTable b
    	where 
    	b.ContractType ='租赁'
    	and b.PerformState ='正在履行'
    	and a.ContractID = b.ContractID
    	and a.CID <> b.CID
    );

    ------------------------------------------图-----------------------------------


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2014年4月11日 2:02
  • 您好,

    另外也可參考「SQL差集的使用(EXCEPT)」。

     


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2014年4月13日 6:25