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

Я не понимаю, почему, когда я ВЫБИРАЮ 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
Руководство для начинающих по веб-разработке на React.js
Руководство для начинающих по веб-разработке на React.js
Веб-разработка - это захватывающая и постоянно меняющаяся область, которая постоянно развивается благодаря новым технологиям и тенденциям. Одним из...
Разница между Angular и React
Разница между Angular и React
React и AngularJS - это два самых популярных фреймворка для веб-разработки. Оба фреймворка имеют свои уникальные особенности и преимущества, которые...
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц....
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
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

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