Что означает «т» в этом SQL? - PullRequest
       24

Что означает «т» в этом SQL?

2 голосов
/ 25 февраля 2012

У меня есть простой запрос в моем коде (показанный ниже), написанный моим коллегой. Что означает t здесь? Кроме того, какова роль ; внутри запроса? Я абсолютно уверен, что 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;

Ответы [ 6 ]

3 голосов
/ 25 февраля 2012

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;
3 голосов
/ 25 февраля 2012

Ваш коллега создал запрос (SELECT COUNT(*)) с подзапросом, который он назвал t.Это t является просто временным именем таблицы, которое ссылается на

SELECT AttemptNo FROM attempt_exercise 
  WHERE FK_UId = @uId AND FK_EId = @eId AND Mode = @mode

Он мог бы реально назвать его temp, чтобы быть немного более явным.Причина, по которой это похоже на таблицу, заключается в том, что в MySQL запрос SELECT возвращает строки данных, которые действуют как таблица.Таким образом, этот внутренний запрос получает AttemptNo и создает временную таблицу t.Внешний запрос затем подсчитывает эти данные.

* * * * * * * * * * * * * * * * * внутри запроса, чтобы сделать его полным оператором, когда программа вызывает запрос string .Если бы это не было включено, String query не содержал бы допустимого оператора MySQL.Последний ; должен завершить присвоение переменной.

1 голос
/ 25 февраля 2012

Все временные таблицы, созданные таким образом (т. Е. В предложении FROM), ДОЛЖНЫ иметь псевдоним, на который они могут ссылаться. В этом случае псевдоним t. Если бы кодировщик был более понятен в написании, он бы не опустил опциональный AS перед ним.

Дело в том, что это просто временное имя, и оно не очень важно в этом сценарии, но для его работы требуется.

Тем не менее, следующее, вероятно, более эффективно:

SELECT COUNT(DISTINCT AttemptNo) FROM attempt_exercise WHERE FK_UId = @uId AND FK_EId = @eId AND Mode = @mode
1 голос
/ 25 февраля 2012

Псевдоним для подзапроса. Если подзапрос появляется в виде таблицы в предложениях FROM или JOIN - он должен иметь псевдоним.

1 голос
/ 25 февраля 2012

Это просто псевдоним для вложенного запроса.Точка с запятой внутри запроса - это терминатор оператора - его часть стандарта ANSI sql.

0 голосов
/ 25 февраля 2012

Точка с запятой - это разделитель строк для команд MySql. Загляните сюда под первым пунктом, чтобы узнать больше: http://dev.mysql.com/doc/refman/5.0/en/entering-queries.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...