2011-09-27 66 views
0

我有两个查询,一个是检查no。次STUDENTNO存在于表Subjects检查其他表中是否存在字段

SELECT COUNT(*) AS COUNT 
FROM Subjects R 
INNER JOIN students w W ON R.studentno = W.studentno 
WHERE R.studentno = '89514' 

下一步是获取有效students(他的名字和学生没有不表SUBJECT存在):

SELECT DISTINCT W. * 
FROM STUDENTS W 
LEFT JOIN SUBJECTS R ON W.STUDENTNO + w.NAME = R.STUDENTNO + r.NAME 
WHERE R.STUDENTNO + r.NAME IS NULL 

我没有在这里得到任何输出。我仍然需要得到那些STUDENTNO存在于SUBJECT表中,但我想这不会重演它。帮帮我。请。你的第二个查询感谢

+2

你认为'+'符号能做什么? –

+0

合并两个字段(作为主键) –

+0

这不是一个好办法。你应该写ON W.StudentNo = R.StudentNo AND W.Name = R.Name。这有很多原因。 –

回答

1

夫妇建议:

  • 使用有意义表的别名!为什么Students别名为W ??
  • 如果你想加入多个列 - 这样做是分开的,而不是通过连接在一起的两列...另外:是StudentNo一个主键?如果是这样的:检查主键相匹配就足够了 - 不需要增加额外的条件,不增加任何价值的JOIN .....

试试这个:

SELECT DISTINCT stu.* 
FROM Students stu 
LEFT JOIN Subjects sub ON stu.StudentNo = sub.StudentNo AND stu.Name = sub.Name 
WHERE sub.StudentNo IS NULL 

或者StudentNo是主键,那么也许这将做到:

SELECT DISTINCT stu.* 
FROM Students stu 
LEFT JOIN Subjects sub ON stu.StudentNo = sub.StudentNo 
WHERE sub.StudentNo IS NULL 

不返回任何东西?

+0

啊。我忘了用我原来的查询,表格和列来编辑它。从来没有这样做会是一件大事。 –

1

第一个查询可以简化为:

SELECT COUNT(*) 
    FROM Subjects 
WHERE StudentNo = '89514'; 

第二大概可以简化为:

SELECT * 
    FROM Students 
WHERE StudentNo NOT IN (SELECT StudentNo FROM Subjects); 

这一提法并假设在主题表的名称相匹配的名称学生桌。如果学生姓名也记录在主题表中,则数据库的设计(严重)存在缺陷。例如,如果不更新Subjects表中的匹配行,则不能更新Students表中的名称 - 这很糟糕。