我试图从我的数据库中提取基于PatientID的发票数据。我想弄清楚哪些发票属于哪个病人。这是我的结构的重要部分。
发票表

InvoiceNumber | DateInvoice | DueDate | StudyID | TypeInvoice

病人表
FirstName | LastName | PatientID

发票字段
id | InvoiceNumber | PatientID |

我需要一个基于PatientID列出发票表数据的查询。下面是我试图查询的问题,但没有找到答案。谢谢你抽出时间。
SELECT    Distinct
          invoicefields.InvoiceNumber,
          invoices.DateInvoice
FROM      `invoices`, `patients`, `invoicefields`
WHERE     invoicefields.PatientID = patients.PatientID
          and invoicefields.InvoiceNumber = invoicefields.InvoiceNumber
GROUP BY  invoicefields.InvoiceNumber

最佳答案

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中)
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返回数据的权限。如果你只想要一个放在上面的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)

09-07 10:59