限制选择中的出现

时间:2012-07-05 12:56:13

标签: sql select subquery

我想做一个选择它给我一组对象,它们有相同的数据。我的问题是:我选择了

select * 
from avi
where codAvi in (select codAVi 
                 from csa 
                 where codEca in (select codEca 
                                  from csa 
                                  where codAvi =19));

我的问题是,如果我codAvi 19有codEca 1,2,3查询返回所有avi与该codEca并且他返回其他例如avi与codEca 1,2,3,4。

任何想法?

3 个答案:

答案 0 :(得分:2)

我不确定你真正想要什么数据。一些示例数据以及您期望输出的内容会有所帮助。

以下是使用连接的查询,也许这会使逻辑更清晰?

select * 
from avi
join csa as csa1 on avi.codAvi = csa1.codAvi
join csa as cas2 on csa1.codEca = csa2.codEca
where csa2.codAvi = 19

答案 1 :(得分:2)

最里面的查询返回所有CSA行,其中codAvi = 19(可能是2,3,4)。

“中间”查询返回所有CSA行的codAVI值,其中codECA位于第一个结果集中。如果那是2,3,4,那么你得到所有与这些codEca值中的至少一个相关的codAVI,并且这里大概是1,2,3,4(也许codAVI 2和codAVI 1都参考了codEca 2) ?)

因此,最外层的查询可以从表AVI返回1,2,3,4的数据,即使1没有引用codAvi 19。


以下是符合我所见情况的一些示例数据:

CSA
codAvi  CodEca
  1       2
  7       7
 19       2
 19       3
 19       4


AVI
codAVI
  1
  7
 19

答案 2 :(得分:0)

最后我用它:

SELECT * FROM avi where codAvi in (SELECT e.codAVi FROM csa e WHERE e.codEca IN (SELECT c.codEca FROM csa C WHERE  c.codAvi = 19) GROUP BY e.codAvi HAVING COUNT(*) = (SELECT COUNT(*) FROM csa a WHERE a.codAvi  = 19))