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 が Unique の場合、重複はありません。ただし、この方法では InvoiceTable にアクセスしてデータを返すことしかできません。1 つだけが必要な場合は、その上に 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)