【问题标题】:SQL Query Using Multiple Table Joins使用多个表连接的 SQL 查询
【发布时间】:2016-09-07 03:52:40
【问题描述】:

在过去的几个小时里,我一直在用头撞墙(我知道这很尴尬),但我似乎无法让这个查询工作!我看过其他类似的问题,在 Youtube 上看过一些教程,但无论出于何种原因,我都无法让我的代码正常工作。所以,唉,我在这里:

该查询应该返回三项内容:DEPT(部门)、CNUM(课程编号)和 CTITLE(课程名称)的学生 ID,该学生 ID 在任何给定学期学习过课程。

例如,我试图让我的查询说明 ID 为 101 并在 2013 年春季参加课程的个人的课程部门、职务和编号。以下是我的代码:

set echo on

spool c:\is\program1.txt

SELECT Courses.DEPT, Courses.CNUM, Courses.CTITLE
FROM Students
    INNER JOIN Enrollments  
        ON Students.SNUM = Enrollments.SNUM
    INNER JOIN SchClasses
        ON Enrollments.CallNum = SchClasses.Callnum
    INNER JOIN Courses
        ON SchClasses.CNUM = Courses.CNUM
AND Students.SNUM = '101'
AND SchClasses.Semester = 'Sp'
AND SchClasses.Year = '2013';

spool off

我的表格数据如下所示:

以下查询正在返回:未选择任何行

我不是在找人为我做我的工作,我只是在寻找一个正确方向的点。任何建议将不胜感激,谢谢!


在大家的帮助下我已经解决了这个问题,非常感谢。事实证明,我在逻辑上是在错误地思考这个问题——实际上没有值插入到 Spring 记录中,因此没有找到行的结果是正确的!

这是一个如此简单的疏忽,但我已经想通了。非常感谢大家;正确的解决方法如下:

set echo on

spool c:\is\program1.txt

SELECT Courses.DEPT, Courses.CNUM, Courses.CTITLE
FROM Students
    INNER JOIN Enrollments  
        ON Students.SNUM = Enrollments.SNUM
    INNER JOIN SchClasses
        ON Enrollments.CallNum = SchClasses.Callnum
    INNER JOIN Courses
        ON SchClasses.CNUM = Courses.CNUM
AND Students.SNUM = '101'
AND SchClasses.Semester = 'Sp'
AND SchClasses.Year = '2013';

spool off

【问题讨论】:

  • 是否有理由将所有条件放在连接语句而不是 WHERE 子句上?除非有特定原因,否则您可能缺少 WHERE 子句。
  • 嗨菲利普。没有特别的原因,我只是看到以这种方式完成的类似问题,我希望得到积极的结果。以前的海报还建议我将第一个条件更改为“where”,但它返回的结果相同:未选择任何行。
  • 您在架构中提供了 2 个额外的表,但未在查询中显示它们。照原样,我怀疑您的查询会返回一个结果——MIS 简介。您是否可能加入 PreReqcnum 300 不存在?
  • 这就是我调试多个连接的方式。首先我将在关联连接中添加相关条件。所以我的查询将类似于:---- FROM Students INNER JOIN Enrollments ON Students.SNUM = Enrollments.SNUM AND St​​udents.SNUM = '101' INNER JOIN SchClasses ON Enrollments.CallNum = SchClasses.Callnum AND SchClasses.Semester = ' Sp' AND SchClasses.Year = '2013' ----- 只需从一个连接开始并检查结果,然后添加另一个,然后添加最后一个。你会发现是哪个连接导致了问题,然后修复它。
  • 找出问题的最简单方法是一次运行一个表的查询。从寻找该学生的学生中进行选择,如果您获得了预期的结果,则将加入添加到注册等中,直到您没有获得预期的结果。

标签: sql join inner-join


【解决方案1】:
set echo on

spool c:\is\program1.txt

SELECT *
FROM Students
    INNER JOIN Enrollments 
       ON Students.SNUM = Enrollments.SNUM AND Students.SNUM = '101'
    --INNER JOIN SchClasses  
    --   ON Enrollments.CallNum = SchClasses.Callnum AND SchClasses.Semester 'Sp' AND SchClasses.Year = '2013';
    -- INNER JOIN Courses     ON SchClasses.CNUM = Courses.CNUM

运行此查询。如果得到结果,请取消注释下一个内部联接。如果您没有得到结果,请调试您的条件不满足的原因。如果您得到结果,请取消注释下一个加入。希望对您有所帮助。

【讨论】:

  • 我之前尝试过这样的事情,从逻辑上讲,这对我来说很有意义,但无论出于何种原因,查询都返回相同的值:没有选择行看起来代码中断@第二个内部连接:SELECT * FROM学生 INNER JOIN Enrollments ON Students.SNUM = Enrollments.SNUM AND St​​udents.SNUM = '101' INNER JOIN SchClasses ON Enrollments.CallNum = SchClasses.CallNum AND SchClasses.Semester = 'Sp' AND SchClasses.Year = '2013';脱线
  • 从该特定联接中的一个条件开始,看看它何时停止为您提供结果,即该联接中有 3 个条件一一添加并检查结果..
  • 看起来第二个连接没有给出正确的结果。如果你看一下结果,它只返回了两条记录..它们都是秋季学期的安迪,不应该至少是春季吗?我不明白这个结果是如何从代码中查询出来的......
  • 据我了解,当您的联接中有“ SchClasses.Semester = 'Sp' ”条件时,您不会得到任何结果。尝试“ LTRIM (RTRIM (schClasses.Semester) ='Sp'" 如 Unnikrishnan R 所述并检查结果..
  • 我有一个示例架构和查询,您可以在此处执行:[链接] (sqlfiddle.com/#!7/54385/1).. 根据您的要求更改架构和查询,如果查询,我将检查问题是什么不工作..
【解决方案2】:

乍一看,您的查询找不到任何问题。

如果将 SNUM 和 Year 列存储为字符串,则字符串左侧或右侧可能会出现空间问题。 你能修剪一下柱子再试一次吗?

 SELECT Students.SNUM ,Enrollments.SNUM ,Enrollments.CallNum ,SchClasses .CallNum
   FROM Students 
    INNER JOIN Enrollments 
      ON Students.SNUM = Enrollments.SNUM 
           AND Students.SNUM = '101' 
    LEFT JOIN SchClasses 
       ON LTRIM(RTRIM(Enrollments.CallNum)) = LTRIM(RTRIM(SchClasses.CallNum))
            --AND LTRIM (RTRIM (schClasses.Semester)='sp'
            --AND LTRIM (RTRIM(schClasses.Year))='2013'

【讨论】:

  • 感谢您的建议,但这并没有返回任何不同。结果相同:未选择任何行。
  • 用左连接改变你的内连接,然后再试一次。让我知道你得到的结果
  • 我还建议现在删除最后的 AND 子句,看看问题出在连接上还是特定记录上
  • CallNum 列的数据类型是什么?尝试更新后的查询,让我知道你得到了什么..
  • 这将返回两条记录,但 Semester、Department 和 Course Number 列都是空白的。
【解决方案3】:

缺少 Where 语句。你应该写 Where 而不是第一个 and。

【讨论】:

  • 嗯,我刚刚将我的第一个条件更新为 'where',它返回了相同的查询:没有选择行。
  • inner join,它们是等价的:stackoverflow.com/a/354095/1073631
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多