Sql 查找没有关联记录的所有记录

Sql 查找没有关联记录的所有记录,sql,ruby-on-rails,Sql,Ruby On Rails,我有一个球队表和一个球员表,我想找到所有没有球员的球队。玩家表通过team\u id列关联。我使用RubyonRails来实现这一点,所以我有一个团队和一个玩家模型 类似这样: select * from teams where id not in (select distinct team_id from players) 如果不存在条件如下: SELECT * FROM teams WHERE NOT EXISTS (SELECT 1 FROM players WHERE players.

我有一个球队表和一个球员表,我想找到所有没有球员的球队。玩家表通过
team\u id
列关联。我使用RubyonRails来实现这一点,所以我有一个团队和一个玩家模型

类似这样:

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

如果
不存在
条件如下:

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

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

执行左连接可能会更好:

SELECT
teams.*
FROM teams
LEFT JOIN players ON (teams.id = players.team_id)
WHERE
players.team_id IS NULL
或者使用ARel(感谢JasonKing的评论):


您使用的是哪种SQL方言?理想情况下,这应该适用于MySQL、Postgres和Sqlite3Perfect,而且我也在使用Rails(我想这是我应该提到的),因此这与:joins和:conditions语法很好地结合在一起。无需使用SQL进行连接,这就是
includes()
所做的。例如:
Team.includes(:players)。where('players.Team\u id为NULL')
最后一个技巧:
Team.includes(:players)。where(:players=>{:Team\u id=>nil})
万岁现代红宝石:
Team.includes(:players)。where(players:{Team\u id:nil})
这种方法的缺点是:如果你有很多玩家的记录,这需要一段时间
Team.includes(:players).where('players.team_id IS NULL')