两个左外连接查询不明确的列名

时间:2013-10-10 07:47:28

标签: sql ruby-on-rails join left-join outer-join

我正在为'问答'论坛制作一个rails 4应用程序。我有一个模型Micropost。我有一个模型QuestionAnswer连接不同的微博作为问题和答案:

Class Micropost < ActiveRecord::Base
  has_many question_answers, foreign_key: "question_id"
  has_many answers, through: :question_answers
  has_one :reverse_question_answer, foreign_key: "answer_id", class_name: "QuestionAnswer"
  has_one :question, through: :reverse_question_answer
end

Class QuestionAnswer < ActiveRecord::Base
  belongs_to :question, class_name: "Micropost"
  belongs_to :answer,   class_name: "Micropost"
end

现在我想做一个数据库查询。我想使用两个LEFT OUTER JOIN来创建一个包含所有问题和答案的联合表:

Micropost.
  joins('LEFT OUTER JOIN question_answers ON question_answers.question_id = microposts.id').
  joins('LEFT OUTER JOIN microposts ON microposts.id = question_answers.answer_id')

我收到错误消息

SQLite3::SQLException: ambiguous column name: microposts.id SELECT "microposts".* FROM "microposts" LEFT OUTER JOIN question_answers ON question_answers.question_id = microposts.id LEFT OUTER JOIN microposts ON microposts.id = question_answers.answer_id ORDER BY created_at DESC

我用上面第二个连接命令中的答案替换了micropost,但它抱怨没有这样的表。我该怎么做两个连接? -Thanks。

1 个答案:

答案 0 :(得分:3)

解决方案是使用以下代码:

Micropost.
  joins('LEFT OUTER JOIN question_answers a ON a.question_id = microposts.id').
  joins('LEFT OUTER JOIN microposts m ON m.id = a.answer_id')

根据您关于别名的问题,a别名代表整个question_answers表。在这个特定的例子中,它只是为了方便。但是,用于m的{​​{1}}别名不是。

在这里,我们定义micropostsm表的别名,表示它与使用microposts之前加入的表不同(此处微博是第一个' 'a.question_id = microposts.id表的实例',并在下一个JOIN中定义另一个为microposts别名提供的实例。

不确定我是否清楚地解释了这一点,请看这里:

m

这里我们再次有两个employees表实例 - 我们从两个表中连接行以获取员工的姓名和经理的姓名。这里需要别名,否则将不清楚哪个列取自哪个表。

如果您想了解有关JOIN的更多信息,请阅读:

http://www.w3schools.com/sql/sql_join.asp

或(还有关于JOIN的更多链接,很好地展示和解释,希望它对您有用):

What is the difference between "INNER JOIN" and "OUTER JOIN"?