我试图找到解决问题的有效方法:
我需要查找表中的所有行,其中有另一行具有相反的列值。
例如,我有列id
和amount
| id | amount |
|----|--------|
| 1 | 1 |
| 2 | -1 |
| 3 | 2 |
| 4 | -2 |
| 5 | 3 |
| 6 | 4 |
| 7 | 5 |
| 8 | 6 |
查询应该只返回前4行:
| id | amount |
|----|--------|
| 1 | 1 |
| 2 | -1 |
| 3 | 2 |
| 4 | -2 |
我目前的解决方案非常有效,因为我正在进行1000次交易:
transactions.find_each do |transaction|
unless transactions.where("amount = #{transaction.amount * -1}").count > 0
transactions = transactions.where.not(amount: transaction.amount).order("@ amount DESC")
end
end
transactions
是否有内置的Rails
或Postgresql
功能可以帮助解决此问题?
答案 0 :(得分:0)
使用以下查询:
SELECT DISTINCT t1.*
FROM transactions t1
INNER JOIN transactions t2 ON t1.amount = t2.amount * -1;
答案 1 :(得分:0)
SELECT * FROM the_table t
WHERE EXISTS (
SELECT * FROM the_table x
WHERE x.amount = -1*t.amount
-- AND x.amount > t.amount
);
答案 2 :(得分:0)
考虑存储绝对值索引列,然后查询正值。 Postgres具有绝对值功能;但我认为ActiveRecord的优点在于Arel抽象出了SQL。如果稍后更改,数据库特定的SQL可能会很痛苦。
答案 3 :(得分:0)