Выберите строки не в другой таблице для каждого условия поля в другой таблице - PullRequest
0 голосов
/ 27 марта 2012

У меня есть две таблицы:

Агенты с колонками: agentid, имя

DocumentsЧитать со столбцами: agentid, document, dateread

Мне нужно идентифицировать всех агентов, которые не читали каждый документ в таблице документов. Таким образом, если Агенты содержат 10 записей, и в DocumentsRead у меня есть 5 записей, показывающих, что doc1 был прочитан, и 4 записи, показывающих, что doc2 был прочитан, мой ожидаемый результат должен содержать 11 записей. 5 показаны агенты, которые не читают doc1, и 6 показаны агенты, которые не читают doc2.

Я понимаю, как использовать различные запросы для определения того, что записи в агентах не существуют в DocumentsRead, но я не могу понять, как заставить это работать для каждого документа, который указан в DocumentsRead.

Ответы [ 3 ]

1 голос
/ 27 марта 2012

Или это:

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

Идея такова:

a) Получить таблицу для случая, если каждый агент будет читать каждый документ:

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 голос
/ 27 марта 2012

Или, может быть, это (аналогично @ socha23 , используется только 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
1 голос
/ 27 марта 2012

Попробуйте этот запрос:

SELECT * 
FROM Agents, (SELECT DISTINCT document FROM DocumentsRead) docs 
WHERE NOT EXISTS (
    SELECT * 
    FROM DocumentsRead 
    WHERE agentid = Agents.agentid AND document = docs.document
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...