2012-07-05 49 views
0

我認爲下面的語句會產生相同的結果...但他們沒有。包含'exists'語句的第一個代碼似乎並沒有通過'QuizID'列來限制所選值,我認爲它應該......作爲一個側面提示,此列只存在於'quizQuestions'中,但不存在於'quizAnswers'轉換我的內部連接SQL語句EXISTS

SELECT qa.QuestionNumber 
FROM QuizAnswers qa 
where exists (SELECT * 
       FROM QuizQuestions 
       WHERE QUIZID = 6) 


SELECT qa.QuestionNumber 
FROM QuizAnswers qa 
    INNER JOIN QuizQuestions IQQ 
     ON qa.QuestionNumber = IQQ.QuestionNumber 
WHERE QUIZID = 6 

包括「內連接」的語句包含我想要的結果集.. 什麼我需要的,包括我爲了得到相同的結果已存在的語句?

回答

2

您的EXISTS查詢正在做什麼,當在QuizQuestions表中存在一行QUIZID6時,選擇所有問題編號。如果有一行,它將選擇所有問題編號,否則,它將選擇無。你需要做的是讓它相關與外查詢,以便它依賴於每個QuestionNmber ...

你需要把AND QuestionNumber = qa.QuestionNumber作爲第二條件在EXISTS,使之成爲相關子查詢。

+0

謝謝,這幫助我澄清了一些關於存在的錯誤觀念,特別是您的編輯。 – DaneEdw 2012-07-05 22:53:05

2

這個查詢

SELECT qa.QuestionNumber FROM QuizAnswers qa where exists (SELECT * FROM QuizQuestions WHERE QUIZID = 6) 

相當於該

SELECT qa.QuestionNumber FROM QuizAnswers qa 

如果與QuizID = 6.請參閱贊恩的答案,要解決這個,這取決於你的SQL實現QuizQuestions什麼,無論如何,使用INNER JOIN版本通常是一個更好的主意。

+0

如果這是對另一個答案的評論,而不是自己的答案,爲什麼不使用評論部分? *(INNER JOIN版本在1:多關係方面也不是很好,EXISTS將維持1:many的1:部分。)* – MatBailie 2012-07-05 22:44:30

+0

@dfb謝謝,我正在將select語句變爲delete聲明一旦我得到正確的。如果我有一個存在聲明,這對我更有意義。這有助於澄清zanes的回答。 – DaneEdw 2012-07-05 22:47:21