我在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
我确定这是一团糟......
答案 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
但我不确定这是不是你想要的。您可能需要将表Patients
,Endoscopy
和Histology
映射到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