【问题标题】:Remove duplicate data in result from two tables从两个表中删除结果中的重复数据
【发布时间】:2013-01-01 17:47:00
【问题描述】:

我是 SQL Server 的新手,我的一个 SQL 查询需要帮助。

我有 2 张桌子(RatingLikeDislike)。

我正在尝试使用 LEFT JOIN 从这两个表中获取数据,如下所示:

SELECT 
   R.ID, R.Topic, R.CountLikes, R.CountDisLikes, R.Extra, LD.UserName, LD.Clikes
FROM 
   Rating As R
LEFT JOIN 
   LikeDislike AS LD ON LD.TopicID = R.ID
ORDER BY 
   R.ID DESC

上面的SELECT 语句显示结果很好,但也包含重复项。我想在显示数据时删除重复项,我尝试使用DISTINCTGROUP BY,但没有运气,可能是因为我没有正确使用它。

更新:为了更清楚和减少混乱,让我告诉你每个表的具体作用以及我想要实现的目标。

Rating 表具有以下列 (ID, Topic, CountLikes, CountDisLikes, Extra, CreatedByUser)。它存储每个主题的主题信息和喜欢和不喜欢的数量以及创建该主题的用户的UserID

LikeDisLike 表具有以下列 (ID, TopicID, UserName, Clikes)。 TopicIDRating 表中 ID 列的 FK。

现在我要做的是从这两个表中获取信息,而不是重复的行。我需要从LikeDislike 表中获取Rating 表中的所有列+UserNameClikes 列中的所有数据,并且没有任何重复的行

更新 2:
以下是此 SELECT 语句的重复结果:

SELECT  
   DISTINCT ld.TopicID, R.ID, R.Topic, R.CountLikes, R.CountDisLikes, 
   LD.UserName, LD.Clikes 
FROM 
   Rating AS R 
LEFT JOIN 
   LikeDislike AS LD ON  LD.TopicID = R.ID

结果输出:

TopicID ID  Topic            CountLikes   CountDislikes UserName    Clikes
NULL    79  Testing at home    1           0             NULL       NULL
NULL    80  Testing at home2   1           0             NULL       NULL 
NULL    82  testing dislikes   0           1             NULL       NULL
1       1   Do You Like This   211         58            3          FALSE
2       2   Or This            17          25            3          TRUE
76      76  Testing part 3     7           5             2          FALSE
76      76  Testing part 3     7           5             3          FALSE
77      77  Testing part 4     16          6             2          TRUE
77      77  Testing part 4     16          6             3          TRUE
77      77  Testing part 4     16          6             5          TRUE

【问题讨论】:

  • 如果您的上述查询返回重复项(并且您尝试过 select distinct),则很可能您的列之一不同,大概是您的评级表中的 ID 列。你目前的输出是多少?
  • 你能举例说明你得到的结果和输入数据吗?
  • 您的一列可能在重复行中具有不同的值
  • 也可能是您的列/表之一采用不同的编码
  • 如果您想将来自LikeDislike 的所有匹配行减少到作为此连接的一部分,您需要告诉我们(最终,SQL Server ),如何减少这些行。例如。从输出中取出最后 3 行。有不同的UserName(可能还有CLikes)值——我们应该如何选择在这里显示的内容? (不要说“第一行”或类似的词,除非您根据可用的列对一行是第一行的含义有一些定义)

标签: sql sql-server tsql


【解决方案1】:

以下语法应删除完整的重复项:

SELECT distinct R.ID, R.Topic, R.CountLikes, R.CountDisLikes, R.Extra,
       LD.UserName, LD.Clikes
FROM Rating As R
LEFT JOIN LikeDislike AS LD on LD.TopicID = R.ID
ORDER BY R.ID desc

这是你试过的吗?

【讨论】:

  • 有什么问题?我怀疑 SQL 正在工作,但你对它应该做什么有不同的期望。
  • 当我使用 Distinct 子句运行上述 select 语句时,它仍然显示所有重复项,而不是删除它们。然而,经过一些谷歌搜索后,我想到了这个 SELECT 语句,它删除了重复项“SELECT R.ID, R.Topic, R.CountLikes, R.CountDisLikes, R.Extra, TopicID FROM Rating AS R Left Join (SELECT TopicID From LikeDisLike Group by TopicID) AS LD on R.ID = LD.TopicID ORDER By R.ID Desc"
  • 上面的代码有效,它也删除了重复的行,但是我如何从 LikeDislike 表中显示更多的列
  • @Aaf - 您删除了 LD.UserName 和 LD.Clicks 列 - 我怀疑这就是它起作用的原因。你想要的结果是什么?显然 LD.UserName 或 LD.Clikes 有不明确的行。祝你好运。
  • @Aaf 。 . .正如我和其他人所建议的那样,修改显示示例数据和示例结果的问题(或此时提出新问题)。这是传达您需要的最简单的方法。
【解决方案2】:

我认为这种方式会为您提供正确的输出

select ID, Topic,CountLikes,CountDisLikes,Extra,
   UserName, Clikes from (
    SELECT distinct R.ID, R.Topic, R.CountLikes, R.CountDisLikes, R.Extra,
   LD.UserName, LD.Clikes
            , ROW_NUMBER() over (partition by R.ID order by R.ID desc) as rid
   FROM Rating As R
    LEFT JOIN LikeDislike AS LD on LD.TopicID = R.ID
    ORDER BY R.ID desc) t where rid=1 order by ID desc

是否请检查likedislike tbl,您在其中插入2个主题以获得相同的评级tbl id并检查用户名,Clikes还检查它们在likedislike tbl中是否相似

【讨论】:

  • 我收到错误“解析查询时出错。 [Token line number = 5,Token line offset = 28,Token in error = over ]' 使用上述查询命令。
【解决方案3】:

试试这个

        SELECT R.ID, R.Topic, R.CountLikes, R.CountDisLikes, R.Extra, 
LD.UserName, LD.Clikes  FROM Rating AS R 
        Left Join ( SELECT TopicID, UserName, min(Clikes) as Clikes 
    From LikeDisLike Group by TopicID,UserName) AS LD 
on R.ID = LD.TopicID ORDER By R.ID Desc

顺便说一句,我认为您需要 UNIQUE(TopicID,UserName) 约束来避免重复。

【讨论】:

  • 我收到错误“函数的指定参数值无效。 [ 参数 # = 1,函数名称(如果已知)= min ]'
  • 列名可能有误。
猜你喜欢
  • 2015-12-06
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-07
相关资源
最近更新 更多