SQL-запрос для выбора записей, ГДЕ НЕ СУЩЕСТВУЕТ - PullRequest
0 голосов
/ 05 апреля 2019

У меня возникла проблема при попытке написать SQL-запрос для фильтрации определенных данных.В основном мой дизайн стола 1 ward can have many beds, and 1 bed can have many enrollments.

Мои ward table has w_id as PK, bed table with b_id as PK and w_id as FK, enrollment table with e_id as PK and b_id as FK.

Сейчас я пытаюсь получить список коек вместе с деталями прихода, которых нет в таблице регистрации.Я попробовал свой SQL-запрос в базе данных Oracle:

SELECT * FROM bed b
INNER JOIN ward w ON b.WARD_ID = w.ID
WHERE NOT EXISTS ( SELECT * FROM bed b2 
INNER JOIN enroll e ON e.BED_ID = b2.ID
WHERE b2.ID = b.ID );

Мне удалось вернуть желаемый результат.Однако, когда я попытался поместить вышеупомянутый запрос как собственный запрос в Spring Boot, я получаю сообщение об ошибке:

Encountered a duplicated sql alias [ID] during auto-discovery of a native-sql query; nested exception is org.hibernate.loader.custom.NonUniqueDiscoveredSqlAliasException: Encountered a duplicated sql alias [ID] during auto-discovery of a native-sql query

Есть идеи?Спасибо!

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

Я не знаю, связано ли это с вашей проблемой, но вам не нужно JOIN в подзапросе.Более простая версия:

SELECT *
FROM bed b INNER JOIN
     ward w
     ON b.WARD_ID = w.ID
WHERE NOT EXISTS (SELECT 1 
                  FROM enroll e
                  WHERE e.BED_ID  = b.ID
                 );
0 голосов
/ 05 апреля 2019
SELECT * FROM bed b
INNER JOIN ward w ON b.WARD_ID = w.ID

Похоже, что на кровати и в палате есть столбцы с именем id.Делая select *, вы неявно включаете все столбцы как с кровати, так и со стола палаты.Итак, вы включаете два столбца с именем id.not exists часть отвлекает.Некоторые клиенты sql позволяют это, но hibernate более строгий.У меня нет среды для немедленного тестирования, но что-то вроде следующего будет исправлено, если это проблема.

SELECT b.id, b.ward_id, w.ward_name FROM bed b
INNER JOIN ward w ON b.WARD_ID = w.ID
WHERE NOT EXISTS ( SELECT b2.id FROM bed b2 
INNER JOIN enroll e ON e.BED_ID = b2.ID
WHERE b2.ID = b.ID );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...