如何检查列A IN(3,4,5)和A NOT IN(1,2)

时间:2013-10-22 20:34:13

标签: mysql sql

有两张桌子。

访问(家长) VisitDocs(儿童)

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

示例:

enter image description here

结果应为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 个答案:

答案 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)上有索引,那么它的表现应相当不错。