比较轨道5中的2个表格

时间:2017-09-20 12:45:04

标签: sql ruby-on-rails ruby activerecord ruby-on-rails-5

我有2个表“existing_practices”& “latest_practices”,都包含一个列“practice_id”

我想要做的是将latest_practices与existing_practices进行比较,以找出我在existing_practices上没有的latest_practices表上的哪些做法(换句话说,我需要找到新的做法)

示例:

existing_practices      latest_practices
------------------      ------------------
practice_id             practice_id
A123                    A123
B123                    B123
C123                    C123
                        D123

所以考虑到上面的2个表,我需要确定“D123”是一种新的做法。

我尝试了以下但是它似乎不起作用:

existing_practices = ExistingPractice.select(:practice_id).all
latest_practices = LatestPractice.select(:practice_id).all

new_practices = latest_practices.to_a - existing_practices.to_a

我认为最简单的方法是编写原始sql但我想以rails方式(如果有的话)这样做。

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:2)

pluck 用于将列值作为数组

获取
new_practices = LatestPractice.pluck(:practice_id) - ExistingPractice.pluck(:practice_id)

答案 1 :(得分:0)

如果您有大量数据,采摘practice_id并减去它们的解决方案效果不佳。相反,我建议:

<强> Okish:

LatestPractice.where.not(practice_id: ExistingPractice.select(:practice_id).map(&:practice_id))

更好:

LatestPractice.where.not("EXISTS(SELECT 1 from existing_practices where latest_practices.practice_id = existing_practices.practice_id)")

更好:

LatestPractice.where('practice_id NOT IN(SELECT DISTINCT(practice_id) FROM existing_practices)')

答案 2 :(得分:0)

您可以直接使用sql以获得更好的性能。

new_practices_id = ActiveRecord::Base.connection.execute("SELECT DISTINCT latest_practices.practice_id FROM latest_practices LEFT JOIN existing_practices ON latest_practices.practice_id =
existing_practices.practice_id WHERE existing_practices.practice_id IS NULL")

这将返回practice_id表中不存在的existing_practices数组。

这是小提琴示例company two columns or tables

你可以使用pluck

这样做
new_practices = LatestPractice.pluck(:practice_id) - ExistingPractice.pluck(:practice_id)