再次修订:
SELECT x.Imaging, x.Indication FROM medicalimaging x
WHERE MCGID = '1036'
and x.Indication not in (
select Indication FROM invoicefields a join invoices b on a.InvoiceNumber = b.InvoiceNumber WHERE a.PatientID = '10120003' and x.MCGID = b.StudyID and x.Imaging = a.TypeOfExam
)
Order By Imaging ASC, Indication ASC
谢谢大家的回答,我做了一些研究,这就是我的想法。
SELECT x.Imaging, x.Indication
FROM medicalimaging x
WHERE MCGID = 'McG 1032'
AND x.Indication NOT
IN (
SELECT Indication
FROM invoicefields a
JOIN invoices b ON a.InvoiceNumber = b.InvoiceNumber
WHERE a.PatientID = '10120003'
AND x.MCGID = b.StudyID
)
我正在试图找出已开具发票的内容并将其从列表中排除。这些是我的表格,一些示例数据和查询结果。
Medical Imaging ( These are the fields to be used in the list)
id | MCGID | Imaging | Indication
1 1032 Xray Visit 1
2 1032 Xray Visit 2
3 1032 Xray Visit 3
4 1032 CT Emergency
5 1045 Xray Initial
invoice ( Generic Invoice Data)
InvoiceNumber | StudyID | TypeInvoice | void |
1 1032 Medical Imaging 0
2 1045 Medical Imaging 0
3 1032 Medical Imaging 1
4 1032 Medical Imaging 0
Invoicefields ( The Rows of charges in the Invoice )
InvoiceNumber | PatientID | TypeofExam | Indication
1 PT25 Xray Visit 1
1 PT30 Xray Visit 1
2 PT36 Xray Initial
2 PT25 Xray Initial
4 PT25 Xray Visit 2
4 PT30 Xray Visit 2
4 PT25 Xray Visit 3
After Query Results
Ex. 1 Provided MCGID=1032 and PatientID=PT25.
Results: CT , Emergency
Ex. 2 Provided MCGID=1032 and PatientID=PT30.
Results: Xray , Visit 3
CT , Emergency
所以,这是通用结构。作为参考,MCGID是SAME作为StudyID,而考试类型是SAME as Imaging。另外需要注意的是MCGID是唯一的,而PatientID仅对MCGID是唯一的。这意味着PatientID可以重用于另一个MCGID。要运行Query,我将为其提供PatientID和MCGID。因此,我的目标是创建一个潜在的成像和指示列表,这些列表未列在TypeofExam和Indication下的invoicefields中。此外,如果void = 1,它也应该忽略发票号。
编辑:
我理解基本的sql函数,我理解如何从多个表中提取数据,我只是不知道如何从多个表交叉引用数据。问题是我必须交叉引用数据大约3次。所以这就是我现在所处的位置。
SELECT medicalimaging.Imaging,medicalimaging.Indication FROM medicalimaging WHERE MCGID='1032'
我只是不确定如何告诉它从其他表中获取数据并将其与我即将提取的数据进行比较。
答案 0 :(得分:1)
这感觉很邋but但似乎有效。 SQLFiddle here。
set @Patient = 'PT25';
set @MCGID = 1032;
select distinct
@Patient PatientID,
m.id,
m.MCGID,
m.Imaging,
m.Indication
from
MedicalImaging m
inner join
(
select
i.StudyID,
f.PatientID,
f.TypeOfExam,
f.Indication
from
invoice i
inner join InvoiceFields f
on i.InvoiceNumber = f.InvoiceNumber
where
f.PatientID = @Patient
and i.StudyID = @MCGID
) p
on m.MCGID = p.StudyID
where not exists
(
select
i.StudyID,
f.PatientID,
f.TypeOfExam,
f.Indication
from
invoice i
inner join InvoiceFields f
on i.InvoiceNumber = f.InvoiceNumber
where
f.PatientID = @Patient
and i.StudyID = @MCGID
and f.TypeOFExam = m.Imaging
and f.Indication = m.Indication
)
;
答案 1 :(得分:1)
最简单的解决方案是使用exists查找具有发票的成像数据并将其排除:
select *
from MedicalImaging mi
where mi.mcgid = 1032
and not exists (select null
from Invoice i
inner join InvoiceFields f
on i.invoicenumber = f.invoicenumber
where i.studyid = mi.mcgid
and i.void = 0
and f.typeOfExam = mi.imaging
and f.Indication = mi.indication
and f.PatientID = 'PT30')
我必须在这里有创意。我已添加InvoiceFields.Indication = MedicalImaging.Indication
以便能够缩小重复考试的范围。这个架构背后的原因我不清楚。也许您有关于患者的未公开表格,这些表格将解释您如何知道要为此查询提供哪种PatientID。
Here is DEMO @ Sql Fiddle。您可以在那里更改模式以提供更多信息,然后发回链接。