2012-03-11 14 views
1

私はテストで行われたグレード3の学生を返す次のSQLクエリを持っています。
生徒1は試験で0を作ったので、質問結果は2人の生徒の成績のみを返します。どのようにして結果にゼロを含めることができますか?どのように私はSQLでカウント関数を使用して0を返すことができます

select u.uno, u.fname, u.lname, count(q.qno) as Test1 from ((users u 
LEFT OUTER JOIN userresponse ur on ur.uno = u.uno) left outer join 
question q on q.correctanswer = ur.response and q.qno = ur.qno and 
q.eno = ur.eno) where q.eno = '1' group by u.uno, u.fname, u.lname 

ur.enoが試験1で、その後、u.unoだけのテーブルを結合する=ユーザーが権利ur.unoを得たものを質問番号と受験番号参加しているとq.corectanswer = ur.responseチェックを問います。

+3

どのデータベースについてですか?これは、ANSI-89 JOIN構文(クエリ)を使用しない理由です。OUTER JOINはサポートされていませんが、副選択は同等です(相関性の低い副問合せは効果的ではありません)。 –

+0

@OMGPonies - ほとんどのデータベースでは非推奨の外部結合機能があります(通常は '+'や '*'で比較を飾ることに基づいています)が、ANSI結合に移動するほうがはるかに良いということに同意します –

+0

@Damien_The_Unbeliever:はい、ありますベンダー固有のものでもあります。 [SQL Server](http://stackoverflow.com/questions/1428144/sql-what-does-mean)、[Oracle](http://stackoverflow.com/questions/2425960/oracle-old-joins-a-)変換のためのツールスクリプト) –

答えて

3

データベーススキーマが正しく理解されていれば、3番目の生徒は0の結果を得られるはずですが、対応する行はuserresponseテーブルにありません。使用しているような通常(「内部」の)結合は、ユーザー応答テーブルに結合する行がない生徒を削除します。一方、外部結合は、他のテーブルに接続する行がなくても行を保持します。したがって、テーブルユーザーとテーブルuserresponseの間で外部結合を使用する必要があります。

EDIT:このような

何か(テストしていません):

SELECT user.uno, user.fname, user.lname, 
     (COUNT(question.qno)*5)/75 as TESTRESULT1 
    FROM ((user LEFT OUTER JOIN userresponse ON ....) 
     LEFT OUTER JOIN question ON ....) 
WHERE 
    .... 
GROUP BY user.uno, user.fname, user.lname 

WHERE後にONの後の結合条件、および追加条件を追加します。最初の外部結合はすべての生徒を保持しますが、応答のない学生のユーザー応答の列にはnull値が入ります。 2番目の外部結合は、テーブルの質問の列にヌル値を持つ応答なしで生徒を保持します。

COUNT(*)は行数をカウントするため、応答のない各生徒は結果に行が追加されるため、COUNT(*)からCOUNT(question.qno)に変更する必要があります。

+0

正しい生徒3は、答えが正解と一致しないためnullです。外部結合を検索してq.correctanswer = ur.response(+)を試しましたが、エラーが発生します。 – user541597

+0

私はこれを動作させることができません。私は(userresponseのurは、q.correctresponse = ur.responseの外部結合質問qを残しました)私はuserresponseテーブルと結合する必要があるuserテーブルを含める必要があります。私はあなたの書式を理解していません。 – user541597

関連する問題