LEFT JOIN with Exists的问题

时间:2017-07-27 04:08:54

标签: sql oracle left-join where exists

我有两个表,Service和Site-它们具有一对多的关系,Service中的一行可能在Site中有多行。

我正在获取Site表,其中一些ID被用于超过一次。现在我想从本站点的Service获取所有行。

SERVICE Table{id}
SITE Table{id,svcId(from SERVICE Table),siteid}

SELECT *
FROM SERVICE
WHERE EXISTS( 
    SELECT * FROM SITE WHERE (siteid='3' or siteid='4') AND id IN (
    SELECT id FROM SITE GROUP BY id HAVING count(*) > 1
))

存在中的选择查询存在,使用siteid 3和4多次获取所有行但是整个查询从SERVICE TABLE获取所有行。我只期待具有匹配ID的行。

2 个答案:

答案 0 :(得分:0)

您应该在条件and s.id = st.svcId中添加适当的别名。

SELECT *
FROM SERVICE s
WHERE EXISTS
  (SELECT *
  FROM SITE st
  WHERE (siteid='3'
  OR siteid    ='4')
  AND id      IN
    ( SELECT id FROM SITE GROUP BY id HAVING COUNT(*) > 1
    ) 
    and s.id = st.svcId
  );

答案 1 :(得分:0)

您似乎想要与BOTH siteid 3 AND 4相关的服务(即该服务的数量将> 1)。

SELECT sv.*
FROM SERVICE sv
INNER JOIN (
      SELECT
            svcId
      FROM SITE
      WHERE (siteid = '3' OR siteid = '4')
      GROUP BY
            svcId
      HAVING COUNT(*) > 1
      ) si ON sv.id = si.svcId