简体   繁体   English

导轨左外连接与行,包括 NULL

[英]Rails left outer join with row including NULL

I need to do a complex outer join.我需要做一个复杂的外部连接。 I wanna have a row in the result for the service interval if there is no service_note that's connected to it.如果没有连接到它的service_note ,我想在service interval的结果中有一行。 As you see from the query service_interval belongs to one service_job which is connected to service_notes through the joint table service_note_jobs .正如您从查询中看到的, service_interval属于一个service_job ,它通过联合表service_note_jobs At the moment it returns an empty relation if there is no service_note connected to that service_interval .目前,如果没有service_note连接到该service_interval ,它会返回一个空关系。

def self.distance_and_time_until_next_service(service_interval_ids)
  ServiceInterval
    .left_joins(vehicle: { service_notes: :service_note_jobs })
    .where(
      'service_note_jobs.service_job_id = service_intervals.service_job_id AND '\
      'service_intervals.vehicle_id = service_notes.vehicle_id'
    )
    .where(service_intervals: { id: service_interval_ids })
    .group('service_intervals.id')
    .select(
      'service_intervals.id',
      "MAX(GREATEST(service_notes.odometer, service_intervals.created_odometer) - vehicles.odometer + service_intervals.distance_interval) AS distance_left_until_next_service",
      "MAX(ROUND(EXTRACT(epoch FROM(GREATEST(service_notes.date, service_intervals.created_at) - NOW())) / 86400  + service_intervals.time_interval)) AS time_left_until_next_service"
    )
end

Try to add this after your left_joins:尝试在您的 left_joins 之后添加:

.where(vehicle: { service_notes: { id: nil } })

Or more general sample或更一般的样本

User.left_joins(:posts).where(posts: { id: nil })

This will give you users with no posts.这将为您提供没有帖子的用户。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM