用于选择相关记录不存在的记录的高效SQL查询

时间:2017-06-09 01:19:23

标签: sql ruby-on-rails sql-server

我正在尝试选择一个用户,其中该用户没有具有特定值的关联记录。

我有一个用户模型,一个用户has_one Feed,一个Feed has_many FeedTracks,一个FeedTrack属于一个Track。我想只选择没有FeedTrack且具有某个TrackId的用户。

我正在使用rails但我会接受严格的SQL。

我得到的最好的是:

 SELECT TOP 1000 * 
 FROM Users u
 LEFT JOIN Feeds f ON f.user_id = u.id
 LEFT JOIN FeedTracks ft ON ft.feed_id = f.id
 ONLY IF ALL OF THOSE feedTracks' track_id !== <<track_id>>

显然,最后一部分语句不是真正的SQL,这就是我的问题。我怎么说,嘿,告诉我这个相关记录不存在的用户。但如果该记录确实存在,请不要返回该用户。

换句话说,如果该用户有一个Feed,其中包含该轨道ID的Feed轨道,请不要返回该用户。但如果没有,请返回该用户。

3 个答案:

答案 0 :(得分:0)

您可以使用GROUP BYHAVING

SELECT u.id
FROM Users u
LEFT JOIN Feeds f 
    ON f.id = u.feed_id
LEFT JOIN FeedTracks ft 
    ON ft.feed_id = f.id
GROUP BY u.id
HAVING 
    SUM(CASE WHEN ft.track_id = @track_id THEN 1 ELSE 0 END) = 0

根据需要修改SELECTGROUP BY中的列。

答案 1 :(得分:0)

尝试

User.joins(feed: :feed_tracks)
        .where('feed_tracks.track_id <> ?', unwanted_track_id)
        .order('id desc')
        .limit(1000)
        .to_sql

答案 2 :(得分:0)

您应该像这样使用appendChild()操作

insertBefore()