首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多对一对多表的SQL

多对一对多表的SQL
EN

Stack Overflow用户
提问于 2016-06-11 01:18:24
回答 4查看 51关注 0票数 0

我在一个Access数据库中有三个表,我通过ucanaccess在java中使用它。

代码语言:javascript
复制
Patients (PK Pt_ID)
Endoscopy (PK Endo_ID, FK Pt_ID)
Histology (PK Histol_ID, FK Pt_ID)

1名患者可以有多个内窥镜检查1名患者可以有多个组织学内镜检查和组织学检查无关

我希望在一个SQL查询中检索单个患者的所有内窥镜和组织学信息。虽然我可以为两个表编写select语句,但我不知道如何跨这三个表执行此操作。是这样的吗?

代码语言:javascript
复制
Select *.Endoscopy,*.Histology from Patients INNER JOIN Endoscopy, Histology ON Patient.Pt_Id=Endoscopy.Pt_ID, Patient.Pt_Id=Histology.Pt_ID

我敢肯定那肯定是一团糟...

EN

回答 4

Stack Overflow用户

发布于 2016-06-11 01:34:56

如果您有多个Endoscopy记录或同一个Patient的多个Histology记录,那么您将在选择中收到重复/重复的记录。我认为除非你使用2个SELECT语句而不是1个,否则没有办法解决这个问题。

代码语言:javascript
复制
SELECT Endoscopy.*, Histology.*
FROM Patients 
INNER JOIN Endoscopy ON Patients.Pt_Id = Endoscopy.Pt_ID
INNER JOIN Histology ON Patients.Pt_Id = Histology.Pt_ID

若要选择某个表上的所有记录,请在select its table name/table alias .*

  • INNER JOIN中选择记录,如果其中一个表不包含包含在其他任何一个表中的记录,则将不会显示带有该Pt_ID

  • To的记录添加其他表继续添加additional join statements

  • You used Patients (带S)和Patient (无S),请确保您使用了正确的名称。我猜可能是它的Patient.

而不是Patients

这条语句的作用与上面的几乎相同,但是使用了左连接语法,这样即使两个表中的一个没有患者的记录,也会始终获得这两个表的记录。

代码语言:javascript
复制
SELECT Endoscopy.*, Histology.*
FROM Patients 
LEFT JOIN Endoscopy ON Patients.Pt_Id = Endoscopy.Pt_ID
LEFT JOIN Histology ON Patients.Pt_Id = Histology.Pt_ID
WHERE Histology.Histol_ID IS NOT NULL OR Endoscopy.Endo_ID IS NOT NULL

添加的WHERE子句确保您不会获得具有所有NULL值的记录,其中有一个患者,但在这两个表中都没有记录。

票数 0
EN

Stack Overflow用户

发布于 2016-06-11 01:35:11

您使用的是哪种SQL DB?

我相信这在大多数情况下都是有效的。

代码语言:javascript
复制
SELECT * FROM Patients, Endoscopy, Histology 
WHERE Patient.Pt_Id=Endoscopy.Pt_ID
AND Patient.Pt_Id=Histology.Pt_ID

此外,我相信如果您需要使用应该是Endoscopy.*, Histology.*的话,您已经将这些转换到了*.Endoscopy,*.Histology

票数 0
EN

Stack Overflow用户

发布于 2016-06-11 01:41:40

您可以使用以下查询来选择内窥镜和组织学:

代码语言:javascript
复制
SELECT p.Pt_ID
     , e.Endo_ID
     , h.Histol_ID
FROM Patients p
INNER JOIN Endoscopy e ON p.Pt_Id = e.Pt_ID
INNER JOIN Histology h ON p.Pt_Id = h.Pt_ID

但我不确定这真的是你想要的。您可能需要将表PatientsEndoscopyHistology映射到Java类中?在这种情况下,您可以考虑Java Persistence API (JPA)。它可以帮助您在java代码中处理这些表。这是一个JPA Quick Guide

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37753892

复制
相关文章

相似问题

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