【问题标题】:Issue with LEFT JOIN with Exists存在的 LEFT JOIN 问题
【发布时间】:2018-01-02 14:53:28
【问题描述】:

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

我正在获取一些 ID 多次使用的站点表。现在我想从该站点的服务中获取所有行。

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
))

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

【问题讨论】:

  • 请提供样本数据和预期结果。
  • service table 与 site table 有什么关系?子查询不通过外部表中的任何列与外部查询相关联,因此它始终提供来自service 表的所有行或不提供任何行。

标签: sql oracle left-join where exists


【解决方案1】:

您应该添加一个条件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
  );

【讨论】:

    【解决方案2】:

    您似乎想要与 siteid 3 和 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
    

    【讨论】:

    • 不知何故,即使该列存在于 DB 中,我总是在这句话“si.svcId”作为无效标识符时收到 sql 错误。不知道怎么回事。
    • 子查询自己工作吗? SELECT svcId FROM SITE WHERE (siteid = '3' OR siteid = '4') GROUP BY svcId HAVING COUNT(*) > 1
    • 那么没有明显的错误原因,除非您删除了答案中显示的子查询别名 si
    • 那么这个错误没有明显的原因。我不能再做任何事情了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    相关资源
    最近更新 更多