Sql “怎么做?”;“存在的地方”;在阿雷尔

Sql “怎么做?”;“存在的地方”;在阿雷尔,sql,ruby,database,ruby-on-rails-3,arel,Sql,Ruby,Database,Ruby On Rails 3,Arel,如何在Arel中执行包含“where exists”的查询?例如,在这样的查询中,显示至少有一个订单的所有供应商: SELECT * FROM suppliers WHERE EXISTS (SELECT * FROM orders WHERE suppliers.supplier_id = orders.supplier_id); 我在Arel文档中看到了“存在”,但我在使用它时遇到了问题。我认为您可以巧妙地使用计数器缓存来实现这一点: 给你: suppliers= Su

如何在Arel中执行包含“where exists”的查询?例如,在这样的查询中,显示至少有一个订单的所有供应商:

SELECT *
FROM suppliers
WHERE EXISTS
  (SELECT *
    FROM orders
    WHERE suppliers.supplier_id = orders.supplier_id);

我在Arel文档中看到了“存在”,但我在使用它时遇到了问题。

我认为您可以巧妙地使用计数器缓存来实现这一点:

给你:

suppliers= Supplier.arel_table
orders= Order.arel_table
suppliers_with_orders = Supplier.where(
                          Order.where(orders[:supplier_id]
                                        .eq(suppliers[:id])).exists).to_sql =>
"SELECT `suppliers`.* FROM `suppliers` 
 WHERE (EXISTS (SELECT `orders`.* 
                FROM `orders` 
                WHERE `suppliers`.`id` = `orders`.`supplier_id`))"
不过,内部联接将以一种更简单、最终性能更低的方式完成此任务:

供应商:订单


所讨论的关系运算符是。我也对这个感兴趣。然而,
存在
节点似乎实际上已经从最新版本的ARel中删除。不确定将来是否有计划。很好!在你链接到另一篇关于
不存在的帖子后,我正要回答这个问题。
再次感谢@pedroloan内部连接将是根本不同的,因为它将返回多份供应商记录副本,每个订单一份。这是一场即将发生的性能灾难,特别是当您在多个关联上组合测试是否存在时,其中10个订单、5个付款和20个交付组合在一起会返回1000条记录。Exists在几乎所有方面都更有效。