#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
синтаксису и условиям обратите внимание на использование псевдонимов таблиц. Это облегчает написание и чтение запроса.