С Новым годом! Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 14.03.2023
Сообщений: 2

Materialized view и запрос данных из одной таблицы

14.03.2023, 17:29. Показов 660. Ответов 4

Студворк — интернет-сервис помощи студентам
У меня есть таблица «турниры» с полями «id», «tournament_name» и таблица «profiles» с полями «id», «first_name», «last_name».
Внутри каждого турнира будет несколько матчей/игр.

Для этих игр я сделал таблицу "tournaments_matches", которая состоит из: "id" (для id матча/игры), "tournament" (связь из турниров.id), "player_1" (связь из profiles.id), "player_2" "(отношение из profiles.id)

Я хочу создать представление, которое будет отображать данные из таблиц турниров и профилей на основании данных из таблицы "tournaments_matches"
| tournament_id | tournament_name | match_id | player_1_id | player_1_first_name | player_1_last_name | player_2_id | player_2_first_name | player_2_last_name |

Я сделал запрос SQL:
SQL
1
2
3
4
5
6
CREATE MATERIALIZED VIEW tournaments_matches_alldata AS
SELECT tournaments.id AS tid, tournaments.tournament_name, tournaments_matches.id AS mid, profiles.id AS pid_1, profiles.first_name AS p1_fn, profiles.last_name AS p1_ln, profiles.id AS pid_2, profiles.first_name AS p2_fn, profiles.last_name AS p2_ln
FROM tournaments_matches
JOIN tournaments ON tournaments.id = tournament
INNER JOIN profiles AS player_1 ON profiles.id = player_1
INNER JOIN profiles AS player_2 ON profiles.id = player_2;
Как и ожидалось, появилось сообщение об ошибке:
Failed to run sql query: invalid reference to FROM-clause entry for table "profiles"

Как получить данные дважды из одной и той же таблицы? Как правильно создать представление?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.03.2023, 17:29
Ответы с готовыми решениями:

Materialized view и union
При попытке создать materialized view c "refresh mode" по "on commit" в состав которого должны войти таблицы объединённые через union...

Не обновляется materialized view oracle
Добрый день! В чем проблема. Создана материальная вьюха, задано условие обновления, Но вьюха не обновляется. CREATE MATERIALIZED VIEW...

Materialized View VS Temp Table
Привет всем, есть запрос который я легко выполняю с помощью TEMP TABLE, но меня попросили сделать его с помощью Materialized View. ...

4
 Аватар для Аватар
5393 / 1465 / 513
Регистрация: 31.05.2012
Сообщений: 5,153
14.03.2023, 19:29
Цитата Сообщение от Kand1 Посмотреть сообщение
profiles.id = player_1
поле id сравниваешь с псевдонимом таблицы. так не бывает. ниже аналогично. по идее так нужно, tournaments.id примерно, не знаю как у тебя привязано
SQL
1
ON player_1.id = tournaments.id
1
0 / 0 / 0
Регистрация: 14.03.2023
Сообщений: 2
14.03.2023, 20:51  [ТС]
Спасибо.

Переделал запрос:
SQL
1
2
3
4
5
6
CREATE materialized VIEW tournaments_matches_alldata AS
SELECT tournaments.id AS tid, tournaments.tournament_name, tournaments_matches.id AS mid, profiles.id AS pid_1, profiles.first_name AS p1_fn, profiles.last_name AS p1_ln, profiles.id AS pid_2, profiles.first_name AS p2_fn, profiles.last_name AS p2_ln
FROM tournaments_matches
INNER JOIN tournaments ON tournaments.id = tournament
INNER JOIN profiles ON profiles.id = player_1
INNER JOIN profiles ON profiles.id = player_2;
Но всё равно ошибка:
Failed to run sql query: table name "profiles" specified more than once
0
 Аватар для Аватар
5393 / 1465 / 513
Регистрация: 31.05.2012
Сообщений: 5,153
14.03.2023, 20:52
ни чего ты не переделал. почитай еще мой пост выше раз 100)
1
 Аватар для index58
59 / 25 / 10
Регистрация: 01.07.2016
Сообщений: 153
15.03.2023, 00:42
Лучший ответ Сообщение было отмечено Kand1 как решение

Решение

Цитата Сообщение от Kand1 Посмотреть сообщение
Но всё равно ошибка:
Failed to run sql query: table name "profiles" specified more than once
В ошибке написано, что имя таблицы "profiles" указано более одного раза. То есть, все приджойниваемые таблицы должны иметь разные имена/псевдонимы.

Цитата Сообщение от Kand1 Посмотреть сообщение
Как получить данные дважды из одной и той же таблицы?
Например так:
SQL
1
2
3
4
5
6
7
8
9
SELECT *
FROM
  tournaments_matches
    JOIN
  (SELECT player_1_id, first_name AS player_1_first_name FROM profiles) AS player_1_profiles
    ON tournaments_matches.player_1 = player_1_profiles.player_1_id
    JOIN
  (SELECT player_2_id, first_name AS player_2_first_name FROM profiles) AS player_2_profiles
    ON tournaments_matches.player_2 = player_2_profiles.player_2_id
В этом случае одна и та же таблица "profiles" выступает под разными псевдонимами: player_1_profiles, player_2_profiles

Цитата Сообщение от Kand1 Посмотреть сообщение
Как правильно создать представление?
Я в такой ситуации сделал бы проще:
1) Создал бы представления-псевдонимы:
SQL
1
2
3
4
5
6
7
8
9
10
11
CREATE VIEW player_1_profiles AS SELECT
  id AS player_1_id,
  first_name AS player_1_first_name,
  last_name AS player_1_last_name
FROM profiles;
 
CREATE VIEW player_2_profiles AS SELECT
  id AS player_2_id,
  first_name AS player_2_first_name,
  last_name AS player_2_last_name
FROM profiles;
2) А затем джойнил бы без оглядки:
SQL
1
2
3
4
5
6
7
8
9
SELECT *
FROM
  tournaments_matches
    JOIN
  player_1_profiles
    ON tournaments_matches.player_1 = player_1_profiles.player_1_id
    JOIN
  player_2_profiles
    ON tournaments_matches.player_2 = player_2_profiles.player_2_id
Добавлено через 16 минут
А вообще, чтобы джойнить вот так без оглядки, в каждой таблице каждая колонка должна иметь уникальное имя. То есть, если ты джойнишь две таблицы, и в каждой из них есть поле "id", то такое приджойнивание без оглядки приведёт к сообщению об ошибке от СУБД, когда ты попытаешься сделать "SELECT id" из сджойненного представления. То есть, СУБД спросит, мол, а какую из двух колонок "id" тебе нужно вывести? И вот чтобы таких ошибок не возникало, я всегда создаю таблицы с колонками, имеющими уникальное имя. Например:
SQL
1
2
3
4
5
6
CREATE TABLE "Project" (
    "Project_ID" bigserial NOT NULL,
    "Project_Title" VARCHAR(300) NOT NULL,
    "Project_Acronym" VARCHAR(150) NOT NULL,
    "Project_Description" VARCHAR(1000)
);
То есть, у меня в имени каждой колонки всегда стоит префикс, состоящий из имени таблицы и знака подчёркивания. Это гарантирует, что при одноразовом сджойнивании каждой таблицы не возникнет конфликтов имён полей. Ну а при двухразовом приджойнивании я делаю так, как показал выше, — создаю представления-псевдонимы. Очень удобно, можешь пользоваться
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.03.2023, 00:42
Помогаю со студенческими работами здесь

Запрос по переносу данных из одной таблицы в другую
Доброго времени суток. Возникла следующая задача, хотелось бы найти, с вашей помощью, ее решение. Предположим у нас имеется две...

Запрос на вывод данных с одной таблицы в другую
Добрый вечер. У меня есть вопрос он наверное глупый но я все таки его напишу. Как мне запрос на вывод данных с одной таблицы в другую в...

Запрос на вставку данных из одной таблицы в другую
Dim insert As New SqlClient.SqlCommand("INSERT INTO Заказы (Код_ассортимента, Количество_заказа, Сумма, Дата) SELECT Код_ассортимента,...

Запрос на добавление данных из одной таблицы в другую
Добрый день, необходимо реализовать следующий запрос: Имеется 2 таблицы Таблица Группа. groupid | userid 25 | 1 ...

Сложный запрос из одной таблицы с предварительной обработкой данных
Ребята не очень силен в запросах и токо начал осваивать постгри. есть таблица структура: camid- камера id, action-(принимает attach или...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru