【问题标题】:inner query where-clause dependent on outer query attribute内部查询 where 子句依赖于外部查询属性
【发布时间】:2016-09-14 17:49:34
【问题描述】:

鉴于这三个表:

学生(sID, sName); 课程(cID, cName);和研究(sID,cID)。

Studies 包含三个具有相同 sID 和不同 cID 的元组,即一个学生学习三门不同的课程。

我正在尝试执行以下查询:

select s.sID, s.sName
from Student s
where 'sID1' in
      (select st.sID
       from Studies st
       where st.sID = s.sID);

据我所知,在运行查询时,应该打印所有三个元组。但是只打印一个元组。到目前为止,我得出的结论是,这是因为内部查询中的 where 子句 where st.sID = s.sID,但我无法理解其背后的逻辑。是因为子句依赖于外部查询吗?为什么只打印一个元组而不是全部三个?

【问题讨论】:

  • 请粘贴表格和所需的输出
  • 学习joint 语法并尽可能远离in。
  • @ajeh 你为什么建议避免使用 IN?当然,这似乎不是解决问题的方式,但这是一个奇怪的笼统声明。
  • 有时in 优化为union。 join 从来没有。
  • @ajeh 这并没有解释你关于避免 IN 的声明。提供细节太模糊了。你有没有解释你想说什么的参考资料?

标签: sql sql-server


【解决方案1】:

我不知道您的要求,但您写的内容使用以下语法更具可读性:

select s.sID, s.sName
from Student s
inner join Studies st on st.sID = s.sID

【讨论】:

    【解决方案2】:

    在您的情况下,“IN”子句检查学生表的 SId 是否存在于研究表中。如果子查询中有多个匹配项,这并不意味着查询应该返回多个结果集。由于只有一名学生,因此查询返回一条记录。

    IN 子句用于检查或确保选择列表应仅返回 IN 条件中提到的那些值。

    【讨论】:

      【解决方案3】:

      您的查询应该只返回一个元组,因为 sID1 与单个学生相关..

       where 'sID1' in
        (select st.sID
         from Studies st
         where st.sID = s.sID);
      

      在子查询中,如果您选择的值超过 sID1 的值,这将由 in 子句解析,就像单个结果一样

      in 子句是一个集合运算符

      【讨论】:

        猜你喜欢
        • 2017-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多