检查其他表中是否存在字段

时间:2011-09-27 06:29:51

标签: sql

我有两个问题,一个是检查否。表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 :(得分: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

这会返回什么吗?

答案 1 :(得分:1)

第一个查询可以简化为:

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

第二个可能简化为:

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

此公式假定Subjects表中的名称与Students表中的名称相匹配。如果学生姓名也记录在“主题”表中,则数据库的设计(严重)存在缺陷。例如,您不能更新Students表中的名称,也不能更新Subjects表中的匹配行 - 这是不好的。