有两张桌子。
访问(家长) VisitDocs(儿童)
我需要显示至少包含docType 3并且没有DocType 1和2的所有访问。有不同的DocType 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)
答案 0 :(得分: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))
答案 1 :(得分:0)
SELECT visitID FROM Visits GROUP BY visitID
HAVING max(decode(docType, 3, 0)) = max(decode(docType, 1, 1, 2, 1, 0))
答案 2 :(得分: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))
答案 3 :(得分: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)
上有索引,那么它的表现应相当不错。