2011-09-27 23 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表中的名稱 - 這很糟糕。