2016-09-07 135 views
0

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

该查询应该返回三件事:DEPT(Department),CNUM(Course Number)& CTITLE(课程标题)的学生的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 

我的表中的数据显示如下: enter image description here

下面的查询将返回:没有行选择

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


我已经解决了这个问题,你的所有帮助,非常感谢你。事实证明,我在逻辑上思考了这种错误的方式 - 实际上没有值插入到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 
+2

是否有你将所有条件放在连接语句而不是WHERE子句的原因?除非有特定的原因,否则WHERE子句可能就是你想要的。 – PhillipXT

+0

嗨菲利普。没有任何理由,我只是看到了类似的问题,我希望取得积极的成果。之前的海报也建议我将第一个条件更改为'where',但是它返回相同的结果:未选择行。 – Lukon

+0

您在模式中提供了2个附加表格,但不会在查询中显示它们。现在,我会怀疑你的查询返回一个结果 - 简介MIS。您是否可以加入'PreReq',其中cnum'300不存在? – sgeddes

回答

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 

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

+0

我想是这样的早些时候,在逻辑上是有道理的我,但无论什么原因,查询返回的值相同:没有选择行 看来代码休息@第二内连接: SELECT * 学生 \t INNER JOIN许可登记 \t \t ON Students.SNUM = Enrollments.SNUM AND St​​udents.SNUM = '101' \t INNER JOIN SchClasses \t \t ON Enrollments.CallNum = SchClasses.CallNum \t \t \t AND SchClasses.Semester =' Sp' \t \t \t AND SchClasses.Year ='2013'; \t 假脱机 – Lukon

+0

从该特定连接中的一个条件开始,看看它何时停止给出u结果,即该连接有3个条件逐个添加并检查结果。 – Nagahornbill

+0

看起来不像第二个连接是给出正确的结果。如果你看看结果,它只会返回两条记录......他们都是秋季学期的安迪,不应该至少有一个春季?我不明白如何根据代码查询结果。 – Lukon

0

Where Where Statement is missing。你应该写在哪里,而不是第一个和。

+0

嗯,我刚刚更新我的第一个条件'where',它返回相同的查询:没有选择行。 – Lukon

+0

对于'inner join',它们是等效的:http://stackoverflow.com/a/354095/1073631 – sgeddes

1

第一次看不出您的查询有任何问题。

如果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' 
+0

感谢您的建议,但是这并没有返回任何不同。相同的结果:没有选择行。 – Lukon

+0

用左连接改变你的内连接,然后再试一次..并让我知道你得到的结果 –

+0

我也建议现在去掉最后的AND子句,看看问题是与连接还是与特定记录 – kbball