Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 Server行_Sql Server - Fatal编程技术网

Sql server 删除冗余的SQL Server行

Sql server 删除冗余的SQL Server行,sql-server,Sql Server,我有两个SQL Server表:日期和跟踪。 在第一个表(日期)中,我们只有两列 (fields): Date_ID (int primary key) Date_Date (datetime). 在第二个(跟踪)中,我们有4列: -Tracking_ID (int primary key) -Date_ID (int foreign key) -Place_ID (int foreign key) -Label_ID (int foreign key). 跟踪的主键是三元组(日期、地点、

我有两个SQL Server表:日期和跟踪。 在第一个表(日期)中,我们只有两列

(fields):
Date_ID (int primary key) 
Date_Date (datetime).
在第二个(跟踪)中,我们有4列:

-Tracking_ID (int primary key)
-Date_ID (int foreign key)
-Place_ID (int foreign key)
-Label_ID (int foreign key).
跟踪的主键是三元组(日期、地点、标签)

我想从跟踪表中删除具有相同日期但具有不同日期id、相同地点id和标签id的行 我只想保留日期ID最小的行

例如,表跟踪中有以下两行:

row1: Tracking_ID=1;Date_ID=109;Place_ID=55;Label_ID=40
row2: Tracking_ID=2;Date_ID=110;Place_ID=55;Label_ID=40
我们在Date表中有以下两行:

row1: Date_ID=109; Date_Date=2014-05-28 00:00:00
row2: Date_ID=110; Date_Date=2014-05-28 00:00:00
我的目的是从跟踪中删除第2行,因为它是具有相同三元组(日期、地点、标签)的最小日期id的行

谁能拥有最优化的解决方案

谢谢

这是我的例子

首先,我收集坏的
跟踪ID
然后我删除它们

DECLARE @Date TABLE(
    Date_ID int,
    Date_Date datetime
)

DECLARE @Tracking TABLE(
    Tracking_ID int,
    Date_ID int,
    Place_ID int,
    Label_ID int
)

DECLARE @ForDelete TABLE(
    Tracking_ID int
)

INSERT INTO @Date SELECT 109,'2014-05-28 00:00:00'
INSERT INTO @Date SELECT 110,'2014-05-28 00:00:00'
INSERT INTO @Date SELECT 111,'2014-05-29 00:00:00'
INSERT INTO @Date SELECT 112,'2014-05-29 00:00:00'
INSERT INTO @Date SELECT 113,'2014-05-29 00:00:00'

INSERT INTO @Tracking SELECT 1, 109, 55, 40
INSERT INTO @Tracking SELECT 2, 110, 55, 40
INSERT INTO @Tracking SELECT 3, 110, 56, 40
INSERT INTO @Tracking SELECT 4, 111, 55, 40
INSERT INTO @Tracking SELECT 5, 111, 55, 40
INSERT INTO @Tracking SELECT 6, 112, 57, 40
INSERT INTO @Tracking SELECT 7, 111, 57, 40
INSERT INTO @Tracking SELECT 8, 113, 57, 40

;WITH test AS (
SELECT T.Tracking_ID, T.Date_ID, T.Place_ID, T.Label_ID, D.Date_Date
FROM @Tracking AS T
INNER JOIN @Date AS D
    ON T.Date_ID = D.Date_ID
)
INSERT INTO @ForDelete
SELECT DISTINCT t1.Tracking_ID
FROM test as t1
INNER JOIN test as t2
    ON t1.Date_Date = t2.Date_Date
    AND t1.Place_ID = t2.Place_ID
    AND t1.Label_ID = t2.Label_ID
    AND t1.Date_ID > t2.Date_ID

DELETE FROM T
FROM @Tracking AS T
INNER JOIN @ForDelete AS FD
    ON FD.Tracking_ID = T.Tracking_ID

SELECT *
FROM @Tracking

稍微不同的方法是直接从cte中删除,而不是将其放入临时删除表中:

;WITH cte AS (
SELECT D.Date_Date, T.Date_ID, T.Place_ID, T.Label_ID, ROW_NUMBER() OVER (PARTITION BY T.Place_ID, T.Label_ID ORDER BY T.Date_ID) AS RowNum
FROM  [Date] D
INNER JOIN Tracking T ON D.Date_ID = T.Date_ID)

DELETE T
FROM cte
INNER JOIN Tracking T ON cte.Date_ID = T.Date_ID AND cte.Place_ID = T.Place_ID AND cte.Label_ID = T.Label_ID
WHERE RowNum > 1

只需注意:
来自跟踪,因为它是具有最小日期id的行
您可能指的是最大日期id,我希望保留具有最小日期id的行,因此我删除具有最大日期id的行:D@user3569267,我觉得你的评论是错误的。如果你有3条记录,那么确定最大的记录是没有帮助的。我认为我们应该找到最小值并基于它进行连接。我们可以不用光标进行连接吗?如果是的话,你能告诉我如何使用SQL语法吗?谢谢