SELECT InvT.InvoiceNumber, InvT.DateInvoice
FROM InvoiceTable InvT
INNER JOIN InvoiceFields InvF ON InvF.InvoiceNumber = InvT.InvoiceNumber AND InvF.PatientID = @PatientID
非常多,因为您只需要 InvoiceTable 中的数据,并且表明您拥有 PatientID。我建议您只需加入交叉引用表 InvoiceFields 并使用该查询中的 PatientID 列将其过滤到您需要的内容。在我意识到您不需要来自患者的任何东西之前,我有一个使用存在的更复杂的示例。
如果您还需要有关患者的信息,您可以使用它(只需将所需的列放在选择中)
SELECT InvT.InvoiceNumber, InvT.DateInvoice
FROM InvoiceTable InvT
INNER JOIN InvoiceFields InvF ON InvF.InvoiceNumber = InvT.InvoiceNumber AND InvF.PatientID = @PatientID
INNER JOIN Patient Pat ON Pat.PatientID = InvF.PatientID
您可以将 @PatientID 部分放在 Patient 或 InvoiceFields 的连接上。如果您的索引是正确的,那么这两种方式之间真的不应该有性能差异。
对以下评论的回应,但我可以在哪里更清晰地展示它:
SELECT IT.InvoiceNumber
,IT.DateInvoice
FROM InvoiceTable InvT
WHERE EXISTS (SELECT InvF.PatientID
FROM InvoiceFields InvF
WHERE InvF.InvoiceNumber = InvT.InvoiceNumber
AND InvF.PatientID = @PatientID)
这将从 InvoiceTable 返回患者的所有行,如果 InvoiceNumber 是唯一的,则不会有任何重复。虽然这种方式您只能访问 InvoiceTable 以从中返回数据。如果您只想要一个在其上放置 TOP 1:
SELECT TOP 1 IT.InvoiceNumber
,IT.DateInvoice
FROM InvoiceTable InvT
WHERE EXISTS (SELECT InvF.PatientID
FROM InvoiceFields InvF
WHERE InvF.InvoiceNumber = InvT.InvoiceNumber
AND InvF.PatientID = @PatientID)