Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL联接和更新删除重复项_Sql Server_Join_Sql Update - Fatal编程技术网

Sql server SQL联接和更新删除重复项

Sql server SQL联接和更新删除重复项,sql-server,join,sql-update,Sql Server,Join,Sql Update,我需要帮助编写更新查询,根据匹配的表更新主表以删除重复项 源表:TBL匹配此匹配表用于根据每行的最新日期比较和选择客户 RowID CustID MatchID Date MatchDate CustName CustMatchName 1 1 2 17-Jan 18-Jan Joe Joe 2 1 3 17-Jan 19-Jan Joe Joe

我需要帮助编写更新查询,根据匹配的表更新主表以删除重复项

源表:TBL匹配此匹配表用于根据每行的最新日期比较和选择客户

  RowID  CustID MatchID Date    MatchDate   CustName    CustMatchName
    1       1       2    17-Jan  18-Jan     Joe         Joe
    2       1       3    17-Jan  19-Jan     Joe         Joe
    3       1       4    17-Jan  20-Jan     Joe         Joe
    4       5       4    21-Jan  20-Jan     Joe         Joe
    5       6       5    22-Jan  21-Jan     Joe         Joe
    7       50      55   01-Jan  02-Jan     Alice       Alice        
如果我们查看每一行,custid和matchid关系是有效的,因为它们的名称相同。无法更改此表的设计

现在我面临的挑战是,所有这5条记录实际上都是一个客户的副本。1->2,1->3,1->4,5->4,6->5用于1->5,1->6链接

因此,我不想从第一行决定谁是最新日期,而是想扫描并确定所有关系,如果有的话。在这种情况下,1或2可以在下面的行中有孩子,最后,拥有最新日期的客户应该在其所有匹配ID中处于活动状态,其余的都应该处于非活动状态

下面是我的诊断表。我期待的结果是,在这个选择和更新过程之后,CustID 6将重新激活=1,其余所有内容都应在下面的tblCustomer中更新为激活=0

tblCustomerDestination表

试试这个:

这将更新字段active=0,并为每个客户名称保留最新的CustID active=1

Create Procedure proc_update_duplicate as 
begin
)
DECLARE @custid nvarchar(30)
DECLARE @custname nvarchar(50)


 DECLARE Customer_cursor CURSOR FOR  select CustID,CustName from
(select max(CustID) as CustID,CustName as CustName from tblCustomer group by CustName) as a

 OPEN Customer_cursor  
    FETCH NEXT FROM Customer_cursor INTO @custid, @custname
  IF @@FETCH_STATUS <> 0   
        PRINT '         <<None>>'       

    WHILE @@FETCH_STATUS = 0  
    BEGIN  

       update tblCustomer set active = 0 where CustID != @custid and custName = @CustName


       FETCH NEXT FROM Customer_cursor INTO @custid,@CustName
   END  
   CLOSE Customer_cursor  
    DEALLOCATE Customer_cursor  
END   
要运行:
exec proc\u update\u duplicate

试试这个……刚刚拼凑起来……结果是额外的领域,这样你就可以看到思想列车……我应该停止这个深夜的东西……啊

编辑:已更新以显示如何更新客户表

CREATE TABLE #tblMatch (
    [RowID] [int] IDENTITY(1,1) NOT NULL,
    [CustID] [int] NULL,
    [MatchID] [int] NULL,
    [Date] [date] NULL,
    [MatchDate] [date] NULL,
    [CustName] [nvarchar](100) NULL,
    [CustMatchName] [nvarchar](100) NULL)

CREATE TABLE #tblCustomer (
    [RowID] [int] IDENTITY(1,1) NOT NULL,
    [CustID] [int] NULL,
    [CustName] [nvarchar](100) NULL,
    [Status] [bit] NULL)

INSERT INTO #tblMatch
    SELECT 1,2,CAST('17-Jan-2017' AS date),CAST('18-Jan-2017' AS date),'Joe','Joe'
        UNION
    SELECT 1,3,CAST('17-Jan-2017' AS date),CAST('19-Jan-2017' AS date),'Joe','Joe'
        UNION
    SELECT 1,4,CAST('17-Jan-2017' AS date),CAST('20-Jan-2017' AS date),'Joe','Joe'
        UNION
    SELECT 5,4,CAST('21-Jan-2017' AS date),CAST('20-Jan-2017' AS date),'Joe','Joe'
        UNION
    SELECT 6,5,CAST('22-Jan-2017' AS date),CAST('21-Jan-2017' AS date),'Joe','Joe'
        UNION
    SELECT 1,4,CAST('17-Jan-2017' AS date),CAST('20-Jan-2017' AS date),'Sam','Sam'
        UNION
    SELECT 5,4,CAST('23-Jan-2017' AS date),CAST('25-Jan-2017' AS date),'Sam','Sam'
        UNION
    SELECT 6,5,CAST('22-Jan-2017' AS date),CAST('21-Jan-2017' AS date),'Sam','Sam'

INSERT INTO #tblCustomer
    SELECT 1,'Joe',1
        UNION
    SELECT 2,'Joe',1
        UNION
    SELECT 3,'Joe',1
        UNION
    SELECT 4,'Joe',1
        UNION
    SELECT 5,'Joe',1
        UNION
    SELECT 6,'Joe',1
        UNION
    SELECT 1,'Sam',1
        UNION
    SELECT 4,'Sam',1
        UNION
    SELECT 5,'Sam',1
        UNION
    SELECT 6,'Sam',1

SELECT [CustID],[CustName],[Status] FROM #tblCustomer
ORDER BY [CustName],[CustID]

UPDATE tCust SET
    tCust.[Status] = tt.[Active]
FROM #tblCustomer tCust INNER JOIN (
    SELECT [CustID],[Date],[CustName],(SELECT MAX(CASE WHEN [Date]>=[MatchDate] THEN [Date] ELSE [MatchDate] END) FROM #tblMatch WHERE [CustName] = t.[CustName] OR [CustMatchName] = t.[CustName]) AS [mxDT],
    CASE WHEN (SELECT MAX(CASE WHEN [Date]>=[MatchDate] THEN [Date] ELSE [MatchDate] END) FROM #tblMatch WHERE [CustName] = t.[CustName] OR [CustMatchName] = t.[CustName]) = [Date] THEN 1 ELSE 0 END AS [Active]
    FROM (
        SELECT DISTINCT cust.[CustID],cust.[Date],cust.[CustName]
        FROM #tblMatch cust INNER JOIN #tblMatch match
        ON cust.[CustName] = match.[CustMatchName]
            UNION
        SELECT DISTINCT match.[MatchID] AS [CustID],match.[MatchDate] AS [Date],match.[CustMatchName] AS [CustName]
        FROM #tblMatch cust INNER JOIN #tblMatch match
        ON cust.[CustName] = match.[CustMatchName]
        ) t
    ) tt
ON tCust.[CustID] = tt.[CustID]

SELECT [CustID],[CustName],[Status] FROM #tblCustomer
ORDER BY [CustName],[CustID]

DROP TABLE #tblCustomer
DROP TABLE #tblMatch

我只是想知道为什么只有一个客户有不同的CustID。嗨,红色,我们必须在列之间和行之间比较每个客户的日期。如果名称匹配,我将尝试此操作,以查看我是否可以在adddate中匹配。您能在此处显示示例数据和示例结果吗?谢谢红色。戴夫帮了我这个忙。我在上面展示的示例数据中,dave添加了几个记录以简化。嗨,dave,你能帮我分离出选择部分和更新部分吗。除了TblCustomer,我还需要在实际代码中更新几个审计表,我计划将所有更新添加到while循环中。因此,如果我们可以使用您输入的逻辑将tblMatch放入临时表中。然后update语句可以针对tmp运行,使其处于活动状态,而非活动状态。在上面提供的示例中,我又添加了几条记录。有时只有一行只有custid和matchid。感谢您查看此更新u set active=0(来自tblCustomer u内部连接tblMatch m on u.custID=case当m.DateCREATE TABLE #tblMatch ( [RowID] [int] IDENTITY(1,1) NOT NULL, [CustID] [int] NULL, [MatchID] [int] NULL, [Date] [date] NULL, [MatchDate] [date] NULL, [CustName] [nvarchar](100) NULL, [CustMatchName] [nvarchar](100) NULL) CREATE TABLE #tblCustomer ( [RowID] [int] IDENTITY(1,1) NOT NULL, [CustID] [int] NULL, [CustName] [nvarchar](100) NULL, [Status] [bit] NULL) INSERT INTO #tblMatch SELECT 1,2,CAST('17-Jan-2017' AS date),CAST('18-Jan-2017' AS date),'Joe','Joe' UNION SELECT 1,3,CAST('17-Jan-2017' AS date),CAST('19-Jan-2017' AS date),'Joe','Joe' UNION SELECT 1,4,CAST('17-Jan-2017' AS date),CAST('20-Jan-2017' AS date),'Joe','Joe' UNION SELECT 5,4,CAST('21-Jan-2017' AS date),CAST('20-Jan-2017' AS date),'Joe','Joe' UNION SELECT 6,5,CAST('22-Jan-2017' AS date),CAST('21-Jan-2017' AS date),'Joe','Joe' UNION SELECT 1,4,CAST('17-Jan-2017' AS date),CAST('20-Jan-2017' AS date),'Sam','Sam' UNION SELECT 5,4,CAST('23-Jan-2017' AS date),CAST('25-Jan-2017' AS date),'Sam','Sam' UNION SELECT 6,5,CAST('22-Jan-2017' AS date),CAST('21-Jan-2017' AS date),'Sam','Sam' INSERT INTO #tblCustomer SELECT 1,'Joe',1 UNION SELECT 2,'Joe',1 UNION SELECT 3,'Joe',1 UNION SELECT 4,'Joe',1 UNION SELECT 5,'Joe',1 UNION SELECT 6,'Joe',1 UNION SELECT 1,'Sam',1 UNION SELECT 4,'Sam',1 UNION SELECT 5,'Sam',1 UNION SELECT 6,'Sam',1 SELECT [CustID],[CustName],[Status] FROM #tblCustomer ORDER BY [CustName],[CustID] UPDATE tCust SET tCust.[Status] = tt.[Active] FROM #tblCustomer tCust INNER JOIN ( SELECT [CustID],[Date],[CustName],(SELECT MAX(CASE WHEN [Date]>=[MatchDate] THEN [Date] ELSE [MatchDate] END) FROM #tblMatch WHERE [CustName] = t.[CustName] OR [CustMatchName] = t.[CustName]) AS [mxDT], CASE WHEN (SELECT MAX(CASE WHEN [Date]>=[MatchDate] THEN [Date] ELSE [MatchDate] END) FROM #tblMatch WHERE [CustName] = t.[CustName] OR [CustMatchName] = t.[CustName]) = [Date] THEN 1 ELSE 0 END AS [Active] FROM ( SELECT DISTINCT cust.[CustID],cust.[Date],cust.[CustName] FROM #tblMatch cust INNER JOIN #tblMatch match ON cust.[CustName] = match.[CustMatchName] UNION SELECT DISTINCT match.[MatchID] AS [CustID],match.[MatchDate] AS [Date],match.[CustMatchName] AS [CustName] FROM #tblMatch cust INNER JOIN #tblMatch match ON cust.[CustName] = match.[CustMatchName] ) t ) tt ON tCust.[CustID] = tt.[CustID] SELECT [CustID],[CustName],[Status] FROM #tblCustomer ORDER BY [CustName],[CustID] DROP TABLE #tblCustomer DROP TABLE #tblMatch