【问题标题】:rails 5 left outer joinrails 5 左外连接
【发布时间】:2018-08-21 14:37:05
【问题描述】:

需要澄清左外连接。 我有一个名为 CLub 的模型

class Club < ApplicationRecord
  has_many :club_members, dependent: :destroy
end

另一个名为 ClubMember 的模型

class ClubMember < ApplicationRecord
  belongs_to :club
end

当我运行类似的查询时

Club.left_outer_joins(:club_members)

它给了我所有来自 lett 表的记录

但是有类似的东西

Club.left_outer_joins(:club_members).where('club_members.is_assigned =?',true)

它只返回那些存在于 ClubMember 中的条目, 我期待它从左表返回 ClubMember 中不存在的条目以及 ClubMember 中状态为 TRUE 的现有条目。 只需将存在于 ClubMemebr 中的条目设为 FALSE 即可。

我有错误的概念或做错了什么?

【问题讨论】:

  • 是的。对于右表没有任何记录的记录,左连接从右表返回空值。但是你得到的是 is_assigned = true 的值。您还需要应用它还应该返回 is_assigned = null 的记录的条件。
  • 没有带有is_assigned的条目——ClubMember中存在null,is_assigned = null在这里做什么?
  • 我不确定 Ruby on Rails。但我认为,这将解决您的问题。 Club.left_outer_joins(:club_members).where("club_members.is_assigned =true OR club_members.is_assigned 为空")
  • 是的,它的工作原理,但你能澄清一下这里发生了什么
  • 刚刚在下面发布了详细信息。

标签: ruby-on-rails postgresql join


【解决方案1】:

左连接:

LEFT JOIN 返回左表中的所有行,即使存在 右表中没有匹配项。

这意味着如果 ON 子句匹配右表中的 0(零)条记录;连接仍然会在结果中返回一行,但在右表的每一列中都有 NULL。

因此,如果我们将条件应用于右表中的任何列。然后它会根据条件返回结果。如果我们想要不匹配的记录。比我们应该添加一个右表也有空值的条件。这就是我在代码中添加的内容。

Club.left_outer_joins(:club_members)
    .where("club_members.is_assigned =true OR club_members.is_assigned is null")

【讨论】:

  • 我的实际查询是 Club.left_outer_joins(:club_members).where.not('club_members.is_assigned =? ',true) NOT 在这里真的很重要。你能告诉我现在怎么用是NULL的东西吗?
  • 试试这个:Club.left_outer_joins(:club_members).where("club_members.is_assigned != true OR club_members.is_assigned 为空")
  • 对不起。我认为,您无需在此处使用 null 情况,因为查询将始终返回 is_assigned 不等于 true 的记录。在这种情况下你没有得到空结果吗?
  • Club.left_outer_joins(:club_members).where("club_members.is_assigned != true OR club_members.is_assigned is null") 工作正常。也给我空记录
  • OR null 是重要的部分!
【解决方案2】:

要返回左侧加上巧合,您可以添加OR。像这样:

Club.left_outer_joins(:club_members).where('club_members.is_assigned =?',true).or(where('condition with the left side'))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 2011-10-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    相关资源
    最近更新 更多