【问题标题】:Ordering issues with self join自加入的订购问题
【发布时间】:2016-02-11 20:35:36
【问题描述】:

我有 2 张桌子。具有 2 列(rID、名称)的审阅者和具有 3 列(rID、mID、星号)的评级。我想选择所有评论者对,以便两位评论者都对同一部电影进行评分。查询应返回两个审阅者的姓名,消除重复并按字母顺序返回每对的姓名。我的代码是:

select distinct Re1.name, Re2.name 
from Reviewer Re1, Rating R1, Rating R2, Reviewer Re2
where R1.mID = R2.mID
and Re1.rID = R1.rID
and Re2.rID = R2.rID
and R1.rID <> R2.rID 
group by R1.mid
order by Re1.name

它产生这个:

Ashley White        Chris Jackson
Chris Jackson       Brittany Harris
Elizabeth Thomas    Daniel Lewis
James Cameron       Elizabeth Thomas
Mike Anderson       Sarah Martinez

...而预期的结果是:

Ashley White        Chris Jackson
Brittany Harris     Chris Jackson
Daniel Lewis        Elizabeth Thomas
Elizabeth Thomas    James Cameron
Mike Anderson       Sarah Martinez

我错过了什么?

【问题讨论】:

  • 想象 A、B、C 在您的数据中,因此您加入将导致 A-&gt;BA--&gt;CC--&gt;AC--&gt;B(以及其他)通过使用 您消除A-->A 但您保留重复的 C-->A。所以通过使用&gt;&lt; 而不是&lt;&gt; 可以消除重复;这应该可以解决订购问题。

标签: sql self-join


【解决方案1】:

使用R1. r ID &lt; R2. r ID 代替&lt;&gt;

这样您就可以根据ID 控制订单。

如果订单应该基于名称,则保留您原来的ON 条件并添加 R1. name &lt; R2. name

【讨论】:

  • 虽然我相信这会解决问题。这将有助于了解为什么这会起作用以及为什么首先会出现问题。
  • 不幸的是,结果相同。
  • @Levente 查看我的扩展答案
  • 你是个天才!只是为了记录,整个工作代码在这里:select distinct Re1.name, Re2.name from Reviewer Re1, Rating R1, Rating R2, Reviewer Re2 where R1.mID = R2.mID and Re1.rID = R1.rID and Re2.rID = R2.rID and R1.rID &lt;&gt; R2.rID and Re1.name &lt; Re2.name group by R1.mid order by Re1.name
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多