Дубликаты строк в результате запроса Postgresql

#sql #database #postgresql

Вопрос:

Я новичок в PostgreSQL и выполняю некоторые запросы.

Я хочу найти «Человека, который был/был вакцинирован после 2021-06-16 годов в городах, название которых начинается с» G «или»V».

Таблицы БД:

Таблица Персон

Таблица Персон

Таблица вакцинации

Таблица вакцинации

Мой вопрос:

 select 
"Person".name,date,vaccination_info  from  public."Person", public."Vaccination" where date > '2021-06-16' and vaccination_info = true and ("Person".name like 'G%' or "Person".name like 'V%');
 

Выход:

Выход

Почему я получаю повторяющиеся строки в результате запроса и как я могу устранить эти дубликаты?

Комментарии:

1. Это реальные данные, которые вы показываете в вопросе, или фиктивные данные?

2. Это фиктивные данные.

3. Ну, очевидно, у некоторых людей было более одной вакцинации.

4. Я бы предположил, что проблема в том, что вы неправильно объединяетесь Person Vaccination . Я вижу, что синтаксис, который вы используете, использует старые объединения стилей, но, похоже, между таблицами и нет никакого соответствия Person Vaccination

5. @wildplasser Вся таблица вакцинации приведена здесь. Все люди указаны в таблице прививок по-разному. Я предполагаю, что в запросе есть другая логическая проблема.

Ответ №1:

Никогда не используйте запятые в FROM предложении. Всегда используйте правильный, явный, стандартный, читаемый JOIN синтаксис.

Лицо, которое было/было вакцинировано после 2021-06-16 годов в городах, название которых начинается на «G» или «V».

Это говорит о том, что вам нужен такой запрос:

 select p.name, v.date, p.vaccination_info 
from  public."Person" p join
      public."Vaccination" v
      on v.person_id = p.id
where v.date > '2021-06-16' and
      v.vaccination_info = true and
      (p.city like 'G%' or p.city like 'V%');
 

В дополнение к правильному JOIN синтаксису и условиям обратите внимание на использование псевдонимов таблиц. Это облегчает написание и чтение запроса.