【问题标题】:Getting duplicate rows in SQL Server在 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。
  • 根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或输入到问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。

标签: sql-server duplicates


【解决方案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,你抓住了它。请给一个人一个正确的答案和赞成票
猜你喜欢
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-04
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
相关资源
最近更新 更多