如何删除重复条目? SQL 服务器 2008
How to remove duplicate entries? SQL Server 2008
如果这个问题已经被问到,我深表歉意,但我正在拔头发!
我有两个table,缩写为KI和UG。 KI 包含一个人及其照片列表,UG 包含另一个人列表。我想要做的是匹配 tables 和 return 一个查询,该查询向我显示我们在 KI 和 UG 之间匹配的名称列表。现在我已经完成一半了,我得到了我的查询并且它工作正常(几乎) - 问题是列表中有大量重复项。最初管理 KI table 的人为同一个人输入了不同的图像,例如 "John Smith" 留下了多行。
这是我的代码:
SELECT ki.name, ug.name, ki.image_file
FROM kantechimages AS ki
INNER JOIN user_group as UG ON ki.name like ug.name
WHERE ki.image_file is not null
GROUP BY ki.name, ug.name, ki.image_file
所以我的问题是,如何从列表中删除重复的名称,并且只删除 return 我们匹配的一行而不是所有匹配项?
非常感谢!
这会给你每人一行,但也只有一个图像文件;
SELECT ki.name, ug.name, max(ki.image_file) as image_file
FROM kantechimages AS ki
INNER JOIN user_group as UG ON ki.name like ug.name
WHERE ki.image_file is not null
GROUP BY ki.name, ug.name
里斯
您的问题似乎表明您只对获取在其他 table 中标记了图像的人的姓名感兴趣。如果是这种情况,您可以只从满足过滤条件的连接中检索不同的名称,如下所示:
SELECT DISTINCT ki.name
FROM kantechimages AS ki
INNER JOIN user_group as UG ON ki.name like ug.name
WHERE ki.image_file is not null
如果您确实需要 return 其他字段,那么您可以尝试以下操作:
;with cte as
(
SELECT ki.name kiname, ug.name ugname, ki.image_file ki_image_file,
row_number() over (partition by ki.name order by ug.name) rn
FROM kantechimages AS ki
INNER JOIN user_group as UG ON ki.name like ug.name
WHERE ki.image_file is not null
)
select kiname, ugname, ki_image_file
from cte
where rn = 1
你得到重复项的原因是你正在使用图像文件进行分组,所以它将 return Table KI 中的所有行都带有一个图像并匹配 Table UG.
如果您只是想 return 匹配的名称列表并且 return 图像文件并不重要,只有图像文件存在,那么下面将工作:
SELECT distinct ki.name
FROM kantechimages AS ki
INNER JOIN user_group as UG ON ki.name = ug.name
WHERE ki.image_file is not null;
如果您要查找名称的精确匹配,则“=”比 'LIKE' 更有效,因为它不执行模式匹配。看到这个 answer.
如果图片很重要,那么您需要确定在table KI 中过滤掉多图姓名的标准。然后如何编写查询将取决于 columns/data 您可以用来创建过滤器的内容。
如果这个问题已经被问到,我深表歉意,但我正在拔头发!
我有两个table,缩写为KI和UG。 KI 包含一个人及其照片列表,UG 包含另一个人列表。我想要做的是匹配 tables 和 return 一个查询,该查询向我显示我们在 KI 和 UG 之间匹配的名称列表。现在我已经完成一半了,我得到了我的查询并且它工作正常(几乎) - 问题是列表中有大量重复项。最初管理 KI table 的人为同一个人输入了不同的图像,例如 "John Smith" 留下了多行。
这是我的代码:
SELECT ki.name, ug.name, ki.image_file
FROM kantechimages AS ki
INNER JOIN user_group as UG ON ki.name like ug.name
WHERE ki.image_file is not null
GROUP BY ki.name, ug.name, ki.image_file
所以我的问题是,如何从列表中删除重复的名称,并且只删除 return 我们匹配的一行而不是所有匹配项?
非常感谢!
这会给你每人一行,但也只有一个图像文件;
SELECT ki.name, ug.name, max(ki.image_file) as image_file
FROM kantechimages AS ki
INNER JOIN user_group as UG ON ki.name like ug.name
WHERE ki.image_file is not null
GROUP BY ki.name, ug.name
里斯
您的问题似乎表明您只对获取在其他 table 中标记了图像的人的姓名感兴趣。如果是这种情况,您可以只从满足过滤条件的连接中检索不同的名称,如下所示:
SELECT DISTINCT ki.name
FROM kantechimages AS ki
INNER JOIN user_group as UG ON ki.name like ug.name
WHERE ki.image_file is not null
如果您确实需要 return 其他字段,那么您可以尝试以下操作:
;with cte as
(
SELECT ki.name kiname, ug.name ugname, ki.image_file ki_image_file,
row_number() over (partition by ki.name order by ug.name) rn
FROM kantechimages AS ki
INNER JOIN user_group as UG ON ki.name like ug.name
WHERE ki.image_file is not null
)
select kiname, ugname, ki_image_file
from cte
where rn = 1
你得到重复项的原因是你正在使用图像文件进行分组,所以它将 return Table KI 中的所有行都带有一个图像并匹配 Table UG.
如果您只是想 return 匹配的名称列表并且 return 图像文件并不重要,只有图像文件存在,那么下面将工作:
SELECT distinct ki.name
FROM kantechimages AS ki
INNER JOIN user_group as UG ON ki.name = ug.name
WHERE ki.image_file is not null;
如果您要查找名称的精确匹配,则“=”比 'LIKE' 更有效,因为它不执行模式匹配。看到这个 answer.
如果图片很重要,那么您需要确定在table KI 中过滤掉多图姓名的标准。然后如何编写查询将取决于 columns/data 您可以用来创建过滤器的内容。