Вернуть отличные / уникальные записи таблицы соединений - PullRequest
0 голосов
/ 25 января 2019

Я соединил несколько таблиц для структурирования своей записи, как показано ниже, но теперь я хочу вернуть уникальные стандарты, которые не назначены для term_year_id 301 (т.е. я хочу вернуть standard_id 1 and 4).

id   standard_id   term_id     term_year_id
 1        1          200            300
 2        2          200            300
 3        2          201            301
 4        3          202            300

Я пытался вернуть записи, которые не равны term_year_id 301, но которые вернули бы standard 2, что мне не нужно. Я также пробовал группу / наличие, но мой синтаксис неправильный?

def school_standards
  @standards = @school.achievement_standards
  .joins("LEFT OUTER JOIN term_standards ON achievement_standards.id = term_standards.achievement_standard_id")
  .joins("LEFT OUTER JOIN terms ON terms.id = term_standards.term_id")
  .group("terms.term_year_id")
  .having("terms.term_year_id <> 301)

end

Какой правильный способ сделать это? Я использую рельсы с postgres.

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Учитывая приведенную выше таблицу и модель для таблицы 'Stt' (Стандартный термин Term_year)

  def test_the_ticket
    rows = [
      {standard_id: 1, term_id: 200, term_year_id: 300},
      {standard_id: 2, term_id: 200, term_year_id: 300},
      {standard_id: 2, term_id: 201, term_year_id: 301},
      {standard_id: 3, term_id: 202, term_year_id: 300}
    ]
    Stt.create! rows
    results = Stt.select(:standard_id, 'array_agg(term_year_id) as term_year_ids').group('standard_id').having('NOT array_agg(term_year_id) @> Array[301]')
    assert_equal([1,3], results.map(&:standard_id))
  end

Возможно, есть лучший / лучший способ, но это подойдет.

  Stt Load (1.8ms)  SELECT "stts"."standard_id", array_agg(term_year_id) as term_year_ids FROM "stts" GROUP BY "stts"."standard_id" HAVING (NOT array_agg(term_year_id) @> Array[301])
0 голосов
/ 25 января 2019

похоже, что вы можете получить уникальный список standard_id, для которого term_year_id равен 301, а затем просто исключить их. что-то вроде ниже должно работать:

select a.*
from myTable a
where standard_id not in (select distinct standard_id from myTable where term_year_id = 301)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...