在 SQL Server 中获取重复行

Posted

技术标签:

【中文标题】在 SQL Server 中获取重复行【英文标题】:Getting duplicate rows in SQL Server 【发布时间】:2021-11-04 15:19:42 【问题描述】:

屏幕截图包含 3 个相互关联的表

第二张截图显示了 SQL 查询和得到的结果:

查询:

SELECT DISTINCT 
    t.topic_id
    , t.topic_name
    , t.topic_cover
    , t.topic_viewers
    , t1.subscribe_id 
FROM 
    tbltopic t 
INNER JOIN 
    tblsubject_grade tg ON (t.subject_garde_id = tg.subject_garde_id) 
INNER JOIN 
    tblsubcription t1 ON (tg.subject_garde_id = t1.subject_garde_id)

【问题讨论】:

那么问题到底是什么? 应该只显示 2 行而不是 4 行 抱歉,您需要清楚地查看您的屏幕打印并弄清楚这一点。 是的,他们说应该只有 2 行;他们没有告诉我们是哪一个,@DougCoats。 根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或输入到问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。 【参考方案1】:

真正的问题是您在几个表中有多个 JOIN 条件

检查此图像:

您会看到 tblsubject_grade 表连接到其他表。

您的查询应该是:

if OBJECT_ID('tempdb..#topic') IS NOT NULL DROP TABLE #topic
if OBJECT_ID('tempdb..#subjGrade') IS NOT NULL DROP TABLE #subjGrade;
if OBJECT_ID('tempdb..#subscription') IS NOT NULL DROP TABLE #subscription;

CREATE TABLE #topic (topic_id int, topic_name varchar(20), topic_cover varchar(20), topic_viewers int, teacher_id int, subject_garde_id int);
CREATE TABLE #subjGrade (subject_garde_id INT, grade_id INT, subject_id INT);
CREATE TABLE #subscription (subscribe_id INT, sub_status INT, sub_date date, student_id INT, archive_status INT, teacher_id int, subject_garde_id int);

INSERT INTO #topic (topic_id, topic_name, topic_cover, topic_viewers, teacher_id, subject_garde_id)
VALUES
(4, 'numbers',  'somestring', 0,2,1),
(6, 'shapes',   'somestring', 0,9,1),
(7, 'story time', 'somestring', 0, 2, 5)

INSERT INTO #subjGrade (subject_garde_id , grade_id , subject_id)
VALUES
(1, 1,  1),
(2, 1,  2),
(3, 1,  3),
(4, 2,  1),
(5, 2,  2),
(6, 2,  3),
(7, 2,  4),
(8, 3,  1)


INSERT INTO #subscription (subscribe_id, sub_status, sub_date, student_id, archive_status , teacher_id , subject_garde_id)
VALUES
(2, 1,  '9-7-2021', 1,0,9,1),
(3, 1,  '9-7-2021', 1,0,2,1)

SELECT
    t.topic_id
    , t.topic_name
    , t.topic_cover
    , t.topic_viewers
    , t1.subscribe_id 
FROM #topic t 
INNER JOIN #subjGrade tg ON t.subject_garde_id = tg.subject_garde_id 
INNER JOIN #subscription t1 ON 
     tg.subject_garde_id = t1.subject_garde_id
     AND t1.subject_garde_id = t.subject_garde_id 
     AND t.teacher_id = t1.teacher_id

【讨论】:

还是一样的输出 @MTB 我错过了加入,再试一次 是的,您需要删除此行 AND tl.student_id = tg.student_id @MTB 我正忙于在本地制作数据集以进行测试 - 是的,我弄乱了 student_id 的 subject_id,你抓住了它。请给一个人一个正确的答案和赞成票

以上是关于在 SQL Server 中获取重复行的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SQL Server 中的表中删除重复行 [重复]

在 SQL Server 视图中插入重复行

SQL Server:分组重复行集

排除 MS SQL Server 2008 中的“某些”重复行

在具有重复行的 SQL Server 表中按组查找行号

如何获取 SQL SERVER 数据库中所有表的行数 [重复]