【问题标题】:Finding all records without associated ones查找所有没有关联的记录
【发布时间】:2009-08-21 22:01:19
【问题描述】:

我有一个团队表和一个球员表,我想找到所有没有与他们关联的球员的球队。玩家表通过team_id 列关联。我为此使用 Ruby on Rails,所以我有一个团队和一个玩家模型。

【问题讨论】:

  • 您使用的是哪种 SQL 方言?
  • 理想情况下这应该适用于 MySQL、Postgres 和 Sqlite3

标签: sql ruby-on-rails


【解决方案1】:

左连接可能会更好:

SELECT
teams.*
FROM teams
LEFT JOIN players ON (teams.id = players.team_id)
WHERE
players.team_id IS NULL

或者使用 ARel(感谢 JasonKing 的评论):

Team.includes(:players).where('players.team_id IS NULL')

【讨论】:

  • 完美,而且我也在使用 Rails(我想我应该提到的东西)所以这与 :joins 和 :conditions 语法很好地联系在一起。
  • 无需使用 SQL 进行连接,includes() 就是这样做的。 IE。 Team.includes(:players).where('players.team_id IS NULL')
  • 最后的技巧:Team.includes(:players).where( :players => { :team_id => nil } )
  • 万岁现代红宝石:Team.includes(:players).where( players: { team_id: nil } )
【解决方案2】:

类似这样的:

select * from teams
where id not in (select distinct team_id from players)

【讨论】:

  • 这种方法的缺点:如果你有很多玩家记录,需要一段时间
【解决方案3】:

您可以使用NOT EXISTS 条件来做到这一点,如下所示:

SELECT *
FROM teams
WHERE NOT EXISTS (SELECT 1 FROM players WHERE players.team_id = teams.team_id)

【讨论】:

    【解决方案4】:

    您通常应该能够执行从父级到子级的外部连接,并检查子级中不可为空的字段中的空值。这通常比“不在”或“不存在”更快。这可能不适用于所有数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-23
      • 1970-01-01
      • 2014-12-08
      • 2023-03-20
      • 2016-08-30
      • 2016-08-12
      相关资源
      最近更新 更多