我必须创建一个每月自动编译的报告。报告只需要是两个应用程序(Rails应用程序,称为应用程序A和B)的电话号码的唯一计数。每个应用程序都有一个PostgreSQL数据库,电话号码是表格中的列。获取每个应用程序中唯一的电话号码很容易,它只是一个'SELECT COUNT(DISTINCT phone_number)...'查询。但是,我无法在两个应用程序中提出一种简单/有效的方法(同样,app A在表中有500k记录,app B有8k)。看来我必须从两张桌子中取出所有电话号码,把它们放在一起然后扔掉重复的电子邮件。问题是在内存中处理的记录太多了。
有人建议最好的方法吗?这是一些额外的信息:
答案 0 :(得分:1)
SQL有一个UNION方法,可能就是您要查找的...在数据库中,您可以在2个查询之间从UNION中提取DISTINCT值。
SELECT DISTINCT ON (phone_number)
FROM
( <subquery1>
UNION ALL
<subquery2>
);
这将为您提供非常有效的SQL查询。现在,如果您想从Rails角度实现这一点,从两个查询中获取结果,那么执行唯一验证将是最好的。
results1 = Table1.select('DISTINCT phone_number')
results2 = Table2.select('DISTINCT phone_number')
results = (results1 + results2).uniq!
希望这就是你要找的东西!
答案 1 :(得分:1)
为了访问不同的数据包装器,请查看dblink和/或外部数据包装器,具体取决于您的Pg版本。
然后你可以在PostgreSQL中完全做到这一点。请记住,您可能想要确保两台服务器仅返回非重复记录。因此,假设您正在使用fdw并假设您设置了外部表pna和pnb,例如:
WITH pnas (phone_number) AS (
SELECT phone_number
FROM pna
GROUP BY phone_number
),
pnbs (phone_number) as (
SELECT phone_number
FROM pnb
GROUP BY phone_number
),
pns (phone_number) AS (
SELECT phone_number
FROM pnas
UNION
SELECT phone_number
FROM pnbs
)
SELECT count(*)
FROM pns;
这当然应该只适用于9.1,但你可以用dblink和PostgreSQL 8.4及更高版本做类似的事情。
答案 2 :(得分:-2)
那么呢:
Table1.count(:group => 'phone_number')
会给你一个计数和值的哈希值。将2个结果合并在一起,你就得到了答案。