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
,您可能还想加入ofid
。 table1
中的所有三个条目都有"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