我试图从我的数据库中提取基于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)