SQL JOIN 重复行

Posted

技术标签:

【中文标题】SQL JOIN 重复行【英文标题】:SQL JOIN duplicating rows 【发布时间】:2011-12-30 02:09:47 【问题描述】:

我正在尝试加入 2 个表并为每个项目获取一行。评分的默认值为 45。每当一个类别中有不同的评分时,每个项目行都会重复。下面是一个示例架构、数据和结果。

表 1-------------------------- 身份证 |项目 |类别-------------- 1 |项目1 |猫1 2 |项目2 |猫1 3 |项目3 |猫1

表 2--------------------------- 身份证 |评级 |类别--------------- 1 | 37 |猫1 2 | 42 |猫1 3 | 45 |猫1

结果------------------------------------ 身份证 |项目 |评级 |类别------------------------------------------------ 1 |项目1 | 37 |猫1 1 |项目1 | 42 |猫1 1 |项目1 | 45 |猫1 2 |项目2 | 37 |猫1 2 |项目2 | 42 |猫1 2 |项目2 | 45 |猫1 3 |项目3 | 37 |猫1 3 |项目3 | 42 |猫1 3 |项目3 | 45 |猫1

预期结果------------------------------------ 身份证 |项目 |评分------------------------------------------------ 1 |项目1 | 37 2 |项目2 | 42 3 |项目3 | 45

查询:SELECT p.ofid,p.item,r.rating FROM table1 AS p INNER JOIN table2 AS r ON p.category = r.category WHERE p.category = "cat1" GROUP BY p.ofid,p.category,r.rating

我尝试添加 DISTINCT、JOIN、LEFT JOIN、RIGHT JOIN.... 有帮助吗?

提前致谢。

【问题讨论】:

请注意,您的“预期结果”有四列,而您的选择语句仅选择三列。我认为这是一个错字。 非常正确。已编辑。谢谢你的收获。 【参考方案1】:

根据您想要的预期结果,我相信您加入了错误的领域。下面应该可以工作。

Select
  p.ofid,
  p.item,
  r.rating
From table1 p 
Inner Join table2 r On r.ofid = p.ofid
where p.category ="cat1"

【讨论】:

更正!!!!我想我只是盯着这个看太久了。尊敬的先生!【参考方案2】:

也许我理解错了,但你不想加入 ofids 吗?

SELECT p.ofid,p.item,r.rating 
FROM table1 AS p 
INNER JOIN table2 AS r 
    ON p.category = r.category AND p.ofid = r.ofid 
WHERE p.category = "cat1" 
GROUP BY p.ofid,p.category,r.rating

【讨论】:

【参考方案3】:

这是一个完全正常的结果,因为您正在对您选择的所有 3 个字段进行分组。如果您想要结果集中每个 ofid 的 SINGLE 副本,则只执行 GROUP BY p.ofid

【讨论】:

我也试过了。它确实给出了正确的行数,但是它为所有 3 个评级给出了 45。 这也是意料之中的。你希望收视率是多少?该ofid的所有收视率的平均值?然后select avg(p.ofid) ...【参考方案4】:

除了(或代替?)category,您可能还想加入ofidtable1 中的所有三个条目都有"cat1"table2 中的所有三个整体也都有"cat1",因此table1 中的每条记录都匹配table2 中的所有三个记录。因此,结果中预期有 3 x 3 = 9 行。你可能想要这样的东西:

SELECT p.ofid,p.item,r.rating
FROM table1 AS p
INNER JOIN table2 AS r ON p.category = r.category
                       AND p.ofid = r.ofid
WHERE p.category = "cat1"
GROUP BY p.ofid,p.category,r.rating

【讨论】:

【参考方案5】:

我相信这就是你想要做的?

SELECT p.offid,p.item,r.rating,r.category FROM table1 p INNER JOIN table2 r
ON p.category = r.category
AND p.offid = r.offid
WHERE p.category = 'cat1'

【讨论】:

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

为 Access 中的 JOIN 中的第二个重复行返回 null

仅对 MYSQL 中最后返回的行执行 JOIN [重复]

Inner Join vs Exists() 同时避免重复行

删除sql查询中的重复行[重复]

sql查询结果中的重复(重复)行

SQL Server 中的 LEFT JOIN 与 LEFT OUTER JOIN