2013-11-20 85 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

相關問題