1

我正在尝试根据 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
4

2 回答 2

2
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)
于 2012-07-13T18:55:51.133 回答
1
SELECT * from invoices i
inner join invoicefields iFld
    on i.invoiceNumber = iFld.invoiceNumber
inner join patients p
    on iFld.patientID = p.patientID
    and p.patientID = 1235125

这至少应该让你朝着正确的方向开始。我不确定您要返回哪些列和/或表中是否有任何空值。Null 将影响返回哪些行

于 2012-07-13T18:50:44.177 回答