[英]SQL query to select records WHERE NOT EXISTS
我在嘗試編寫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
。
我現在要做的是獲取床位清單以及登記表中不存在的病房詳細信息。 我在Oracle數據庫中嘗試了我的SQL查詢:
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
有任何想法嗎? 謝謝!
SELECT * FROM bed b
INNER JOIN ward w ON b.WARD_ID = w.ID
床和病房表似乎都有名為id
列。 通過選擇*,您隱含地包括床和病房表中的所有列。 所以你要包含兩個名為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 );
我不知道這是否與您的問題有關,但您不需要子查詢中的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
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.