2015-03-24 3 views
1

У меня есть запрос, я не очень понимаю:Объяснить SQL Синтаксис:. Выбрать TBL *

SELECT DISTINCT TBL.* 
FROM (
SELECT 
    attribute1, 
    attribute2, 
    etc... 
FROM table) TBL 

Я предполагаю, что TBL дает результат установить имя, но зачем это нужно в избранных и что делает '.' делать?

+0

Это совсем не обязательно и не имеет практической цели. Возможно, это был чей-то способ обойти строгое правило, которое помешало 'select *', но разрешено 'select tbl. *'. – shawnt00

ответ

2

Точка . означает, что вы ВЕ колонку (или все столбцы) таблицы TBL (в вашем случае подзапрос)

Внешний запрос просто применяет DISTINCT для каждого столбца внутреннего запроса

Обратите внимание, что в вашем случае это не имеет особого смысла иметь вложенный запрос, вы можете переписать запрос следующим образом:

SELECT DISTINCT att1, att2, ... FROM table 

Также обратите внимание, что если вы не используете агрегаты, ваш запрос функционально эквив зало к Группе:

SELECT att1, att2, ... FROM table GROUP BY att1, att2, ... 
+0

Но это столбцы, а не поля ... – jarlh

1

В вашем примере, нет никакой разницы между TBL.* и *, но предположим, что ваш запрос был что-то вроде

Select * from Customer 
    Inner Join Country on Country.ID = Customer.CountryID 
    where Country.Code = 'UK' 

Это будет возвращать каждый столбец в как клиента и таблицы стран, тогда как

Select Customer.* from Customer 
    Inner Join Country on Country.ID = Customer.CountryID 
    where Country.Code = 'UK' 

возвращает только столбцы в таблице клиентов

+0

@a_horse_with_no_name. Исправлено (смешение синтаксиса C# и Sql) – sgmoore

0

То же, этот тоже:

SELECT DISTINCT TBL.* 
FROM (
    SELECT 
     attribute1, 
     attribute2, 
     etc... 
    FROM (
     SELECT 
      attribute1, 
      attribute2, 
      etc... 
     FROM table 
     ) TBL2 
    ) TBL 

Вид глупо, не так ли?

TBL и TBL2 - это имена, которые «существуют» только для целей обращения к вещам внутри запроса. Я указывал, что в любое время, когда вы упоминаете таблицу в предложении FROM как table TBLn, это в основном эквивалентно высказыванию (SELECT * FROM table) TBLn.

Есть много веских причин вставлять эти выражения (например, производные таблицы, вложенные представления, встроенные представления) внутри запросов, но их практическое значение становится более очевидным только тогда, когда вы смотрите на пример, который не так бессмыслен, как тот, там.

Я не знаю ни одной платформы, которая не требует такое имя, как TBL. В некоторых случаях было бы удобно просто оставить это. В моем запросе не было двусмысленности в ссылках на столбцы, на которые я даже не упомянул «TBL2». И в этом смысле я вообще ничего не делаю.

На процедурный язык я мог бы создать целый каскад бессмысленных назначений переменных (скажем a1 = 42; a2 = a1; a3 = a2; a4 = a3; a5 = a4; ...), и компилятор, скорее всего, поймет, что большинство переменных никогда не привыкнут, и поэтому он не будет беспокоить ненужные обращения к циклам памяти или процессора на них. По сути, он признает, что вы на самом деле ничего не делали с ними. Не рассматривайте SQL как процедурный язык, но аналогичным образом парсер SQL (и оптимизатор) собирается разрешить все эти временные/сокращенные имена и выяснить, как наилучшим образом вернуть результаты запроса.

+0

Что вы делаете с 'TBL2'? Это способ наименования набора результатов? «TBL» не является фактической таблицей в моей базе данных, поэтому я немного запутался. – iliketolearn

0

Как я вижу, этот вопрос стартер все еще не понимает. Я считаю, что он знает некоторые основы ООП. Предположим, у вас есть массив некоторых классов на вашем языке программирования ООП. Допустим, что это что-то вроде:

<classA>Array[] TBL = new classA(); 

Класса будет что-то вроде:

class classA { 
int attribute1, 
string attribute2, 
... 
} 

Тогда давайте говорить, что у вас есть данные в уже этом классе, поэтому массив TBL имеют некоторые элементы внутри , Если вы хотите получить некоторые элементы из этого массива, вы делаете что-то вроде TBL[1].getAttribute1, TBL[1].getAttribute2....

Итак, в вашем вопросе у вас есть массив данных, в SQL мире называется подзапрос и вы даете имя его как «ТПС» (вы можете выбрать любое имя, которое вам нравится).

(
SELECT 
    attribute1, 
    attribute2, 
    etc... 
FROM table) TBL 

Теперь вы хотите получить элементы из этого массива. По синтаксису SQL вам нужно указать, что именно вы хотите получить. Например: TBL.attribute1, TBL.attribute2, ... Но если вы хотите показать все элементы этого массива, вы просто используете * вместо этого. -> TBL. *

Теперь вернемся к SUBQUERY. Вместо него вы можете использовать таблицы/представления/функции. Все они могут быть названы с любым именем, которое вам нравится (name = alias). И позже вы можете использовать этот псевдоним для упрощения написания кода.

Смежные вопросы