SQL 查询过滤记录

Posted

技术标签:

【中文标题】SQL 查询过滤记录【英文标题】:SQL Query filtering records 【发布时间】:2014-09-03 18:02:24 【问题描述】:

我正在处理一个查询以显示未授予的职位报价 (awarded: false)。 下面的代码运行良好,但我有其他 Jobquotes 被授予 (awarded: true) 具有相同的 job.id。我想知道是否有一种方法可以过滤结果以删除具有相同 job.id 的任何 Jobquotes,其中一个被授予。

一个工作有很多工作引用 Jobquotes 是 Jobs 和 Quotes 之间的连接表

awarded 在职位引用中

x = Jobquote.select('*, (total_cost/quote_qty) AS cost_each')
.includes(job: [:part], quote: [:vendor])
.where(awarded: false)
.where.not("quotes.quote_number" => nil)
.order("parts.number, cost_each")
.group(:quote_id, "parts.number")

【问题讨论】:

请注意,where(awarded: false) 是一种更通用的表达方式。 'f' 是 Postgres 特有的。 谢谢@tadman,已经更正了 在我看来,Job 应该是基于Jobquoteawarded。这将使上述逻辑更简单,因为您只能选择不是awarded 的作业。你有什么类型的标志吗? 该作业有很多引号,因此有一个作业引号连接表。因此,该工作的具体报价将被授予。 awardedQuote 的一部分还是Jobquote 的一部分? 【参考方案1】:

您可以尝试这样的事情:(请注意,我觉得有更好的方法可以做到这一点,只是现在想不出任何东西)

class Jobquote < ActiveRecord::Base
  belongs_to :job
  belongs_to :quote
  scope :awarded_job_quotes, -> where(awarded: true)
  scope :open_job_quotes, -> 
        awarded_job_ids = awarded_job_quotes.pluck(:job_id)
        where.not(job_id: awarded_job_ids)
        
  scope :display_open_job_quotes, -> 
        open_job_quotes.select('*, (total_cost/quote_qty) AS cost_each')
        .includes(job: [:part], quote: [:vendor])
        .where.not("quotes.quote_number" => nil)
        .order("parts.number, cost_each")
        .group(:quote_id, "parts.number")
        
end

然后你可以调用为

 Jobquote.display_open_job_quotes

这将查找所有已授予的工作,然后将它们从job_id 的查询中排除。然后我创建了一个 scope(display_open_job_quotes) 来返回请求的数据,因为我觉得像这样的长查询链可能会分散控制器的注意力。

注意:这将运行一个额外的查询来获取初始的job_ids

【讨论】:

我不得不承认我对你的注:有点困惑 @Beengie 现在您正在运行单个查询。此解决方案将运行初始查询以收集所有已授予的job_ids,然后仅获取job_id 并在事后运行您的查询。这会创建 2 个查询,第一个是 job_ids,然后是你的。当我以一种可能会改变性能的方式改变程序时,我总是喜欢指出,即使它本质上是轻微的。 我不确定您是否说我需要为 job_ids 添加另一个查询,而不是 open_job_quotes... 正在测试... @Beengie 我可以理解我将笔记的措辞更改为更加清晰的困惑。 我添加了.select('*, (total_cost/quote_qty) AS cost_each'),非常完美。感谢多层次的教育。

以上是关于SQL 查询过滤记录的主要内容,如果未能解决你的问题,请参考以下文章

sql 查询语句 数据库 过滤重复记录

SQL 查询 - 如何按 null 或不为 null 进行过滤

查询SQL,写一个查询SQL用来过滤表中数据,类似select ... from?

Spark Sql 查询嵌套记录。我想先过滤嵌套的记录数组,然后爆炸(将它们展开成行)

基于同一表上的另一个查询过滤记录的 SQL

以另一种方式提高动态 SQL 查询性能或过滤记录