2013-11-20 124 views
0

以下是表结构(一对多关系)。每个组(T01,T02,T03 ......)将不得不邮票号码或无印记编号如何根据两列筛选(一对多关系)表中的行

enter image description here

我想基础上的DocType和StampNum从图1中给出的结果集过滤行领域。我想显示除docType 4和StampNum为空的行之外的所有行。如果有一个带有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) 
+0

试试这个更新中...'SELECT * FROM EmpDocs一个WHERE DOCTYPE <> 4和ISNULL(StampNum, '')<> ''' – Dhaval

+0

后在这里sqlfiddle.com –

+0

@ user1263981从坑回答没有解决你的问题? –

回答

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) 
+0

如果有一个带有docType 4的StampNum,那么它应该包含在内。 – user1263981

+0

@ user1263981再次尝试我更新,正如你所说的 –

+0

它不包括ID 7,其中doctype是4与stampNumber。我更新了我的问题。 – user1263981

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

StampNum列没有空值是有一个空 值

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进行演示。

+0

_“这可能会比其他解决方案更快”_'NOT EXISTS'应该优于'NOT IN'(**在SQL Server **上) 。不是出于性能原因(应该是相同的计划),而是因为可空列的问题。 http://www.sqlperformance.com/2012/12/t-sql-queries/left-anti-semi-join –

+0

@TimSchmelter我对性能的评论是关于我的第二个解决方案,既不使用“NOT EXISTS”也不使用“NOT IN” '。无论如何,感谢这篇文章,很高兴知道'NOT EXISTS'是最好的选择。 – Pit

相关问题