Что (*) прячется за собой в этом коде

Я не понимаю, почему, когда я ВЫБИРАЮ 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

Трудно сказать, не зная, как выглядят ваши таблицы

derpirscher 16.02.2023 22:38

Зачем все эти подзапросы? Похоже, вы могли бы получить тот же результат, используя простое и прямое соединение

Frank Heikens 16.02.2023 22:41

Это сбивает с толку то, что вы пытаетесь сделать, можете ли вы добавить ясности с некоторыми примерами данных в виде расходуемого текста.

Stu 16.02.2023 22:41

добавил фото стола

Evgeny Step 16.02.2023 22:45
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
4
70
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Удалите подзапросы и используйте простой запрос:

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 Step 16.02.2023 23:14

@Evgeny смотрите редактирование ответа, который не использует соединения.

Bohemian 16.02.2023 23:59

Этот подходит. Спасибо!

Evgeny Step 17.02.2023 01:49

@EvgenyStep: второй запрос по-прежнему использует соединения, просто не используя оператор JOIN.

a_horse_with_no_name 17.02.2023 07:19

@a_horse_with_no_name Я согласен, но в задаче все еще не разрешено прямое использование соединений, и я нашел, что скрывается за оператором (*). По моему вопросу это - person_id и pizzeria_id, так что вопрос можно закрыть

Evgeny Step 17.02.2023 09:45
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 скрывается за оператором (*)

Evgeny Step 17.02.2023 13:39

Другие вопросы по теме