0

有两张桌子。

访问(父) VisitDocs(子)

我需要显示至少具有 docType 3 并且没有 DocType 1 和 2 的所有访问。有不同的 DocTypes 1 到 15。

例子:

在此处输入图像描述

结果应该是 101,因为访问 101 没有 docType 1 或 2。它是一对多的关系。

我尝试了以下查询,但它不起作用。

Select v.visitID, d.visitdoc From Visits v

INNER JOIN VisitDocs d ON d.VisitID = v.VisitID

WHERE d.docType = 3 and d.docType Not IN (1,2)
4

4 回答 4

0

尝试这个。我相信您可以通过几个 JOIN(或至少一部分)来做到这一点,但您没有要求您的返回列应该是什么

SELECT v.visitID
FROM Visits AS v
WHERE EXISTS(SELECT * 
  FROM VisitDocs AS d
  WHERE d.VisitID = v.VisitID
    AND d.docType = 3)
  AND NOT EXISTS(SELECT * 
                 FROM VisitDocs AS d
                 WHERE d.VisitID = v.VisitID
                   AND d.docType Not IN (1,2))
于 2013-10-22T20:45:08.637 回答
0
SELECT visitID FROM Visits GROUP BY visitID
HAVING max(decode(docType, 3, 0)) = max(decode(docType, 1, 1, 2, 1, 0))
于 2013-10-22T21:01:09.637 回答
0

进入所需的条件,然后对于否定的情况,在连接条件中使用带有非键条件的外连接,在 where 子句中使用 null 结果来“匹配”丢失的行,然后最后连接到主表和它的孩子:

select v.*, vd.*
from VisitDocs vd3
left join VisitDocs vd2 on vd2.VisitId = vd3.VisitId
    and vd2.docType = 2
left join VisitDocs vd1 on vd1.VisitId = vd3.VisitId
    and vd1.docType = 1
join Visit v on v.id = vd3.VisitId
join VisitDocs vd.VisitId = vd3.VisitId
where vd3.docType = 3
and vd2.VisitId is null
and vd1.VisitId is null 

如果你有一个索引VisitDocs(docType)VisitDocs(VisitId)它应该表现得很好。

于 2013-10-22T23:17:20.867 回答
0

上面的答案似乎非常接近,只是复制了一个类似的结构并进行了测试。我在下面修改过的选择(刚刚删除了'AS'关键字并将最后一个'NOT IN'更改为'IN',它似乎对我有用。

SELECT v.visitID
FROM Visits v
WHERE EXISTS(SELECT * 
   FROM VisitDocs d
   WHERE d.VisitID = v.VisitID
   AND d.docType = 3)
   AND NOT EXISTS(SELECT * 
                  FROM VisitDocs d
                  WHERE d.VisitID = v.VisitID
                  AND d.docType IN (1,2))
于 2013-10-22T21:27:49.090 回答