2012-03-27 34 views
0

我有兩個表:選擇行不是在另一個表中的其他表中的字段的每個條件

代理與列:的agentId,名

DocumentsRead與列:的agentId,文檔,dateread

我需要確定所有沒有閱讀過文檔讀取表中每個文檔的代理。因此,如果代理商持有10條記錄,並且在DocumentsRead中我有5條記錄顯示doc1已被閱讀,4條記錄顯示doc2已被閱讀,我的預期結果應該包含11條記錄。 5顯示未閱讀doc1和6的代理顯示未閱讀doc2的代理。

我明白如何使用各種查詢來識別代理中的記錄不存在於DocumentsRead中,但我無法弄清楚如何爲DocumentsRead中列出的每個Document執行此操作。

+1

你有一個'Documents'表?是否有其他方法可以確定是否有尚未讀取的文檔,例如:它們被分配給'DocumentsRead'中的代理,但NULL爲'dateread'? – HABO 2012-03-27 12:15:20

+0

沒有文檔表。即我們只知道誰讀過文檔。如果文件存在,則所有代理都應該讀取它。 – user107327 2012-03-29 08:46:36

回答

1

嘗試此查詢:

SELECT * 
FROM Agents, (SELECT DISTINCT document FROM DocumentsRead) docs 
WHERE NOT EXISTS (
    SELECT * 
    FROM DocumentsRead 
    WHERE agentid = Agents.agentid AND document = docs.document 
) 
+0

非常感謝。這工作完美。 – user107327 2012-03-29 11:44:38

1

或者這樣:

SELECT AG.AgentId, DOC.document 
FROM Agents AG, 
(select document from DocumentsRead) DOC 
except 
select DOC1.AgentId, DOC1.document from DocumentsRead DOC1 

的理念是:

一)獲取表的情況下,如果每個代理會閱讀每一個文件:

SELECT AG.AgentId, DOC.document 
FROM Agents AG, 
(select distinct document from DocumentsRead) DOC 

b)獲取文件已經通過代理人讀發言::

select distinct DOC1.AgentId, DOC1.document from DocumentsRead DOC1 

C)排除(b)由(a)使用except(在這種情況下distinct尚未需要)

+1

應該工作,我想。也許,'DISTINCT'是不必要的,因爲它被'EXCEPT'所暗示。 – 2012-03-27 14:32:14

+0

好點(關於'DISTINCT'),thx。 – Elena 2012-03-27 15:01:27

1

或者,也許這(同@socha23's,只使用的LEFT JOIN + WHERE IS NULL代替NOT EXISTS):

SELECT 
    a.agentid, 
    a.name, 
    d.document 
FROM Agents a 
    CROSS JOIN (SELECT DISTINCT document FROM DocumentsRead) d 
    LEFT JOIN DocumentsRead r ON a.agentid = r.agentid AND d.document = r.document 
WHERE r.agentid IS NULL 
相關問題