不确定下面的例子是否接近。
因为我必须模拟样本数据并猜测预期结果。
但是,在子查询中进行聚合,然后比较总数可能会有帮助。
(或通过having条款)
示例代码段:
declare @Recipients table (RecipientId int primary key, GroupId int);
declare @DocumentTransactions table (TransactionId int primary key, DocumentId int);
declare @DocumentsSent table (DocumentId int, RecipientId int, TransactionId int);
declare @RecipientEmails table (RecipientId int, TransactionID int);
insert into @Recipients (RecipientId, GroupId) values
(201,1),(202,1),(203,1),(204,2),(205,2),(206,2);
insert into @DocumentTransactions (TransactionId, DocumentId) values
(301,101),(302,101),(303,101),(304,102),(305,102),(306,102);
insert into @DocumentsSent (DocumentId, RecipientId, TransactionId) values
(101,201,301),(101,202,302),(101,203,303)
,(102,204,304),(102,205,305),(102,206,306);
insert into @RecipientEmails (RecipientId, TransactionId) values
(201,301),(202,302),(203,303)
,(204,304);
SELECT DocumentId
FROM
(
SELECT
tr.DocumentId,
rcpt.GroupId,
count(distinct sent.RecipientId) AS TotalSent,
count(distinct rcptmail.RecipientId) AS TotalRcptEmail
FROM @DocumentsSent AS sent
LEFT JOIN @Recipients AS rcpt ON rcpt.RecipientId = sent.RecipientId
LEFT JOIN @DocumentTransactions AS tr
ON (tr.TransactionId = sent.TransactionId AND tr.DocumentId = sent.DocumentId)
LEFT JOIN @RecipientEmails AS rcptmail
ON (rcptmail.TransactionId = sent.TransactionId AND rcptmail.RecipientId = sent.RecipientId)
GROUP BY tr.DocumentId, rcpt.GroupId
) AS q
WHERE (TotalSent = TotalRcptEmail OR (TotalSent > 0 AND TotalRcptEmail = 0))
GROUP BY DocumentId;
/*
SELECT
tr.TransactionId,
sent.DocumentId,
sent.RecipientId AS RecipientIdSent,
rcpt.GroupId AS GroupIdRcpt,
rcpt.RecipientId AS RecipientIdRcpt,
rcptmail.RecipientId AS RecipientIdEmail
FROM @DocumentsSent AS sent
LEFT JOIN @Recipients AS rcpt ON rcpt.RecipientId = sent.RecipientId
LEFT JOIN @DocumentTransactions AS tr
ON (tr.TransactionId = sent.TransactionId AND tr.DocumentId = sent.DocumentId)
LEFT JOIN @RecipientEmails AS rcptmail
ON (rcptmail.TransactionId = sent.TransactionId AND rcptmail.RecipientId = sent.RecipientId);
*/
返回:
DocumentId
----------
101