另一个复杂的SQL查询

时间:2012-07-21 20:33:09

标签: mysql sql

再次修订:

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'

我只是不确定如何告诉它从其他表中获取数据并将其与我即将提取的数据进行比较。

2 个答案:

答案 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。您可以在那里更改模式以提供更多信息,然后发回链接。