如何根据两列过滤(一对多关系)表中的行

时间:2013-11-20 10:25:37

标签: sql-server

这是表结构(一对多关系)。每组(T01,T02,T03 ......)将有一个印章编号或无印章编号

enter image description here

我想基于DocType和StampNum字段过滤图1中给出的结果集中的行。我想显示除了那些具有docType 4和StampNum为Null的行之外的所有行。如果有一个带有docType 4的StampNum,则应该包含它。

结果看起来像是

enter image description here 我尝试了以下sql但它没有显示正确的结果。

SELECT * FROM EmpDocs a
WHERE NOT EXISTS ( select * from EmpDocs b 
        where a.ID = b.ID 
          and b.DocType = 4 and b.StampNum is not null) 

3 个答案:

答案 0 :(得分:0)

试试这个:

SELECT * FROM Employee a 
WHERE NOT EXISTS ( select * from Employee b 
                   where a.ID = b.ID 
                   and b.DocType = 4 
                   and b.StampNum is  null)

答案 1 :(得分:0)

SELECT * FROM EmpDocs WHERE DocType <> 4 and StampNum <> ' '

StampNum列没有空值是否为空 值

答案 2 :(得分:0)

以下似乎正常运作:

SELECT *
FROM employee
WHERE ID NOT IN (
  SELECT ID
  FROM employee
  WHERE DocType = 4
    AND StampNum is NULL
)

这将选择所有行,但不包括ID位于DocType = 4 AND StampNum is null行的行中的行。

请参阅SQL Fiddle进行演示。

编辑:实际上,您只需使用一个SQL语句即可解决此问题:

SELECT * FROM employee
WHERE DocType <> 4 OR (DocType = 4 AND StampNum is not null)

如果性能对您来说可能是一个问题,这可能会比其他解决方案更快,但这只是一个猜测。 另外,SQL Fiddle用于演示。