2012-02-25 15 views
2

私は私の同僚が書いた私のコード(以下に示す)で簡単なクエリを持っています。 tの意味は?また、クエリ内に;の役割は何ですか?私はtがテーブルでもなく、データベースのどこにもないことを確信しています。そして、このクエリがどんな動作をするかを推測してください! (必要に応じて他の情報のため)このSQLでは "t"は何を指していますか?

string query = @"SELECT COUNT(*) FROM (SELECT AttemptNo FROM attempt_exercise 
       WHERE FK_UId = @uId AND FK_EId = @eId AND Mode = @mode)t; 
       "; 

コードは次のように次の:

MySqlCommand cmd = new MySqlCommand(query, _conn); 
cmd.Parameters.AddWithValue("@uId", uId); 
cmd.Parameters.AddWithValue("@eId", eId); 
cmd.Parameters.AddWithValue("@mode", mode); 
attemptCount = Convert.ToInt32(cmd.ExecuteScalar()); 
_conn.Close(); 
return attemptCount; 
+0

@BenLeeいいえ、私がtを削除すると、「すべての派生テーブルには別のエイリアスが必要です」というメッセージが表示されます – nawfal

答えて

3

あなたの同僚は、彼がtを命名することをサブクエリでクエリ(SELECT COUNT(*))を作成しました。このt

彼が実行可能にもう少し明確にするためにそれ tempを命名している可能性が
SELECT AttemptNo FROM attempt_exercise 
    WHERE FK_UId = @uId AND FK_EId = @eId AND Mode = @mode 

を指し、単に一時テーブル名です。これがテーブルのようになる理由は、MySQLではSELECTクエリがテーブルのように動作するデータの行を返すためです。したがって、この内部クエリはAttemptNoを取得し、tという一時テーブルを作成します。外部クエリは、このデータをカウントします。

クエリ内の;は、文字列クエリがプログラムによって呼び出されたときに完全なステートメントにすることです。これが含まれていない場合、文字列queryには有効なMySQL文が含まれません。最後の;は、変数の割り当てを完了することです。

+0

どのようにクエリが 'SELECT AttemptNo FROM attempt_exercise どこでFK_UId = @ uIdとFK_EId = @ eIdとMode = @ mode'が最初にテーブルですか?それは、テーブル名ではなく、値を返しますか? – nawfal

+0

@nawfalデータの「テーブル」を構成するテーブルの行を返します。それで、「t」という名前をエイリアスと呼ぶ – simchona

+0

ああ、あなたが答えにその情報を追加して、それがはっきりして完全になるようにしたいと思っています:) – nawfal

1

これは、ネストされたクエリの単なるエイリアスです。クエリ内のセミコロンは、ANSI SQL標準の一部であるステートメントターミネータです。

3

tは、サブクエリのエイリアスです。必要があります。

だからあなたが書かれている可能性があり:

SELECT COUNT(*) FROM attempt_exercise 
WHERE FK_UId = @uId AND FK_EId = @eId AND Mode = @mode; 
をし、それが同等であったであろう。

しかし、あなたが何か他のものにあなたのサブクエリに参加しようしていた、あなたはおそらく少し早く必要性を見ているだろう:

SELECT COUNT(*) FROM 
    (SELECT AttemptNo FROM attempt_exercise 
    WHERE FK_UId = @uId AND FK_EId = @eId AND Mode = @mode) t 
JOIN AttemptStatisticsTableOfSomeSort a 
    ON t.AttemptNo = a.AttemptNo; 
+0

を知りたかったことを嬉しく思っています。これはまた正しいです – nawfal

1

別名サブクエリへ。サブクエリがテーブルソースとしてFROMまたはJOIN句に表示される場合は、エイリアスが必要です。

1

この方法で作成されたすべての一時テーブル(つまり、FROM句)には、それらが参照できるエイリアスが必要です。この場合、別名はtです。コーダーが書面でより明確になっていれば、その前にオプションのASを省略していないでしょう。

重要なのは、一時的な名前であり、このシナリオではあまり重要ではないが、機能させる必要があるということです。

前記、次はおそらく、より効率的である:

SELECT COUNT(DISTINCT AttemptNo) FROM attempt_exercise WHERE FK_UId = @uId AND FK_EId = @eId AND Mode = @mode 
+0

ニースの答え。ありがとう。より効率的なクエリを提供する努力を感謝しますが、私の場合は別にする必要はありませんが、すべての 'AttemptNo' :)しかし、調整可能な、ありがとう:) – nawfal

+0

私は複数の答えをマークできます。これはまた正しいです – nawfal

+0

@kolink:OPのクエリは別々の 'Attemptno'を数えません。それはそれらのすべてを数えます。 –

関連する問題