Sql server SQL联接和更新删除重复项
我需要帮助编写更新查询,根据匹配的表更新主表以删除重复项 源表:TBL匹配此匹配表用于根据每行的最新日期比较和选择客户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
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.Date
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