首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于选择不存在的记录的SQL查询

用于选择不存在的记录的SQL查询
EN

Stack Overflow用户
提问于 2019-04-05 09:44:19
回答 2查看 125关注 0票数 0

当我尝试编写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查询:

代码语言:javascript
复制
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时,我得到了错误消息:

代码语言:javascript
复制
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

有什么想法吗?谢谢!

EN

回答 2

Stack Overflow用户

发布于 2019-04-05 09:56:16

代码语言:javascript
复制
SELECT * FROM bed b
INNER JOIN ward w ON b.WARD_ID = w.ID

病床和病房表似乎都有名为id的列。通过执行select *操作,您隐式地包含了bed表和ward表中的所有列。因此,您将包含两个名为id的列。not exists部分让人分心。一些sql客户端将允许这样做,但hibernate更为严格。我没有一个可以立即测试的环境,但如果这是问题所在,下面这样的东西就可以解决了。

代码语言:javascript
复制
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 );
票数 0
EN

Stack Overflow用户

发布于 2019-04-05 14:02:57

我不知道这是否与您的问题有关,但是您不需要在子查询中使用JOIN。一个更简单的版本是:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55527163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档