Sql 通过每个病例的多个记录筛选不存在的数据

Sql 通过每个病例的多个记录筛选不存在的数据,sql,sql-server,Sql,Sql Server,因此,我对SQL比较陌生。我遇到了一些让我完全困惑的事情 我有一张表[Tab1],大致如下: IDNo | FileType ------------------------ 1 | type1 1 | type2 1 | type3 1 | type4 2 | type2 2 | type3 2 | type4 3 | type1 3 | type3 3 | type4 4 | type2 4

因此,我对SQL比较陌生。我遇到了一些让我完全困惑的事情

我有一张表[Tab1],大致如下:

IDNo  | FileType 
------------------------  
   1  | type1
   1  | type2
   1  | type3
   1  | type4
   2  | type2
   2  | type3
   2  | type4
   3  | type1
   3  | type3
   3  | type4
   4  | type2
   4  | type3
  Pno | Status
------------------------  
   1  | AC
   2  | CA
   3  | AC
   4  | AC
然后我有另一张表[Tab2]如下:

IDNo  | FileType 
------------------------  
   1  | type1
   1  | type2
   1  | type3
   1  | type4
   2  | type2
   2  | type3
   2  | type4
   3  | type1
   3  | type3
   3  | type4
   4  | type2
   4  | type3
  Pno | Status
------------------------  
   1  | AC
   2  | CA
   3  | AC
   4  | AC
我需要筛选Tab2,以仅显示AC状态记录,同时检查Tab1以查看每个Pno缺少哪些文件。这是我得到的最接近的结果

SELECT Pno from Tab2 where Pno NOT IN (

SELECT DISTINCT t1.Pno FROM (SELECT IDNo, Filetype FROM Tab1 where Filetype LIKE 'Type1') As t1 ) AND Status = 'AC'
但是,这并不能确保IDNo下的Tab1中没有重复记录。我用了另外两种方法,包括这个方法(),但它不起作用,因为它返回了误报。这是我的第二次尝试,我从研究中得到了一些东西,并修改了我所拥有的

SELECT Pno, Status 
from Tab2 
where Pno NOT IN (
SELECT DISTINCT t1.IDNo 
FROM (
    SELECT IDNo, FileType 
    FROM Tab1 
    where FileType LIKE 'Type 1') 
As t1 ) 
AND Status <> 'CA'
Order by Tab2.Pno

由于只有PNo 1和3为Ac状态,并且在OP下面的注释中拥有类型1文件,因此所需的输出为状态='Ac',没有文件类型=类型1。虽然这与问题中列出的期望输出不匹配,但这是一个可以实现该结果的查询:

Select Pno
From Tab2
Where Status = 'AC'
And Pno not in (Select IDNo
                From Tab1
                Where FileType= 'type1')

查看给定的Tab1和Tab2,输出应该是:4

或者添加一个表,显示正确的输出应该是什么样子。请在底部添加。您使用的是哪种DBMS?博士后?神谕DB2?Firebird?数据库在RBDMS上RBDMS是缩写。您使用的数据库产品的名称是什么?因为我需要的不是Status='AC',而是Status='AC',并且没有Type1表单。在我的问题中,我会尽量使这一点更清楚。@EF87,在您的输出中,您有1和3。在Tab1中,您有记录1,Type1和3,Type1。从你上面的评论来看,我认为1和3应该被排除在外,4应该被包括在内。请澄清并更新您的问题。抱歉,您是对的。这就是为什么我应该更小心地在睡眠不足的时候发布东西。问题已更新。而且,我和一个和我一起工作的人找到了答案。我很快就会把它寄出去。