SQL用于多对一到多个表

时间:2016-06-10 17:18:24

标签: sql database ms-access

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

Patients (PK Pt_ID)
Endoscopy (PK Endo_ID, FK Pt_ID)
Histology (PK Histol_ID, FK Pt_ID)

1名患者可以进行多次内窥镜检查 1名患者可以有许多组织学 内窥镜检查和组织学无关[

]

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

Select *.Endoscopy,*.Histology from Patients INNER JOIN Endoscopy, Histology ON Patient.Pt_Id=Endoscopy.Pt_ID, Patient.Pt_Id=Histology.Pt_ID

我确定这是一团糟......

4 个答案:

答案 0 :(得分:0)

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

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
  • 在选择其表名/表别名中选择表上的所有记录。*
  • INNER JOIN只会选择存在关系的记录,一旦这些表中的一个不包含Pt_ID,其中任何一个表中都包含它,那么就不会显示任何记录Pt_ID
  • 要添加其他表,请继续添加其他连接语句
  • 您在一个位置使用Patients(带S)而在另一个位置使用Patient(无S),请确保使用正确的命名。我猜它是Patients,但可能是Patient

此语句与上述语句几乎相同,但使用LEFT JOIN语法,因此即使两个表中的一个没有患者的记录,您也将始终获得两个表的记录。

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值的记录,其中有一个患者但其中任何一个表中都没有记录。

答案 1 :(得分:0)

您使用的是哪种SQL数据库?
我相信这适用于大多数人。

SELECT * FROM Patients, Endoscopy, Histology 
WHERE Patient.Pt_Id=Endoscopy.Pt_ID
AND Patient.Pt_Id=Histology.Pt_ID

另外,我相信你已经切换了这些*.Endoscopy,*.Histology如果你需要使用它,它应该是Endoscopy.*, Histology.*

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

首先想法是使用inner join(语法正确),但这是错误的。 inner join会返回两个程序的患者。纯left join还会返回没有的患者。所以这就是解决方案:

SELECT Patients.Pt_PK, Endoscopy.*, Histology.*
FROM Patients 
LEFT JOIN Endoscopy ON Patients.Pt_Id = Endoscopy.Pt_ID
LEFT JOIN Histology ON Patients.Pt_Id = Histology.Pt_ID
--exclude patients who don't have any
where coalesce(Endoscopy.Endo_ID, Histology.Histol_ID) is not null