簡體   English   中英

用於選擇記錄的SQL查詢WHERE NOT EXISTS

[英]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 PKbed table with b_id as PK and w_id as FKenrollment 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM