Я не понимаю, почему, когда я ВЫБИРАЮ pizzeria_name и person_name во вложенном запросе FROM, это не работает, но когда я вместо этого ставлю (*)
, я вижу два столбца, отображаемые на экране с именами person_name и pizzeria_name. Как я могу заменить (*)
, чтобы увидеть тот же результат?
SELECT ( SELECT person.name FROM person WHERE person.id = pv.person_id ) AS person_name,
( SELECT pizzeria.name FROM pizzeria WHERE pizzeria.id = pv.pizzeria_id ) AS pizzeria_name
FROM (
SELECT *
FROM person_visits
WHERE visit_date BETWEEN '2022-01-07' AND '2022-01-09'
) AS pv
ORDER BY person_name ASC, pizzeria_name DESC;
Я пробовал все pizzeria.id, pv.pizzeria_id и т. д., но это не работает.
Любые типы соединений запрещены
Вот так выглядит мой стол [1]: https://i.stack.imgur.com/vaWVB.png
Зачем все эти подзапросы? Похоже, вы могли бы получить тот же результат, используя простое и прямое соединение
Это сбивает с толку то, что вы пытаетесь сделать, можете ли вы добавить ясности с некоторыми примерами данных в виде расходуемого текста.
добавил фото стола
Удалите подзапросы и используйте простой запрос:
select
person.name as person_name,
pizzeria.name as pizzeria_name
from person_visits
join person on person.id = person_visits.person_id
join pizzeria on pizzeria.id = person_visits.pizzeria_id
where visit_date between '2022-01-07' AND '2022-01-09'
order by 1, 2 desc
Предполагается стандартное соглашение об именах столбцов.
Если вам абсолютно необходимо использовать подзапросы:
select
(
select person.name
from person
where person.id = person_visits.person_id
) as person_name,
(
select pizzeria.name
from pizzeria
where pizzeria.id = person_visits.pizzeria_id
) as pizzeria_name
from person_visits
where visit_date between '2022-01-07' AND '2022-01-09'
order by 1, 2 desc
Это выглядит хорошо, но я не могу использовать соединения в соответствии с правилами задачи
@Evgeny смотрите редактирование ответа, который не использует соединения.
Этот подходит. Спасибо!
@EvgenyStep: второй запрос по-прежнему использует соединения, просто не используя оператор JOIN.
@a_horse_with_no_name Я согласен, но в задаче все еще не разрешено прямое использование соединений, и я нашел, что скрывается за оператором (*). По моему вопросу это - person_id и pizzeria_id, так что вопрос можно закрыть
SELECT ( SELECT person.name FROM person WHERE person.id = pv.person_id ) AS person_name,
( SELECT pizzeria.name FROM pizzeria WHERE pizzeria.id = pv.pizzeria_id ) AS pizzeria_name
FROM (
SELECT person_id, pizzeria_id
FROM person_visits
WHERE visit_date BETWEEN '2022-01-07' AND '2022-01-09'
) AS pv
ORDER BY person_name ASC, pizzeria_name DESC;
person_id, pizzeria_id скрывается за оператором (*)
Трудно сказать, не зная, как выглядят ваши таблицы