SQL одинаковое имя столбца разрешено

Когда я запускаю этот запрос в SQL Server

SELECT custid AAA, companyname AAA
FROM Sales.Customers
WHERE country = 'USA'

Он работает нормально. Но теперь набор результатов имеет двойное имя столбца (AAA). Почему SQL-сервер разрешает это? Как приложение работает, если ему нужно ссылаться на имя столбца? Я знаю, если вы поместите этот запрос в производную таблицу, SQL остановит вас. как

SELECT * 
FROM 
     (SELECT custid AAA, companyname AAA
      FROM Sales.Customers
      WHERE country = 'USA') BBB

SQL Server сообщает об ошибке:

Столбец "AAA" был указан несколько раз для "BBB"

Какова логика этого?

Спасибо

Ответ 1

Причина этой проблемы:

1-й запрос

SELECT custid AAA, companyname AAA
   FROM Sales.Customers
   WHERE country = 'USA'

Здесь вы назначаете псевдоним столбца во время вывода, поэтому AAA является именем столбца (на самом деле), прикрепленным во время возвращаемого результата, но я думаю, вы увидите только 1-й столбец с AAA другим будут удалены из-за возможного столкновения во время дальнейших ссылок. поэтому здесь вы не получаете ошибку.


Второй запрос
SELECT * FROM (
    SELECT custid AAA, companyname AAA
    FROM Sales.Customers
    WHERE country = 'USA') BBB

Здесь вы получили ошибку, потому что вы выбираете записи из Inline View с именем BBB, здесь, что Внутренний запрос (встроенный просмотр) рассматривается как таблица (для вашего оператора SELECT * FROM), и, как мы знаем - в основном таблица не может иметь несколько одинаковых имен столбцов, из-за этого вы получаете ошибку, что BBB имеет несколько столбцов AAA.

Ответ 2

Это можно объяснить пониманием порядка выполнения различных логических фаз выполнения запроса. Заказ выполнения запроса MSDN

В SQL Server порядок FROM > WHERE > SELECT i.e. выполняется первое предложение FROM, предложение WHERE и последний - список SELECT.

Теперь в вашем первом запросе извлекаются все соответствующие строки из таблицы Sales.Customers, а затем столбцы, указанные в списке SELECT, затем применяются имена псевдонимов.

В вашем втором запросе внутренний запрос выполняется успешно как первый запрос, но когда предложение внешнего запроса FROM пытается извлечь столбцы из набора результатов, возвращаемого внутренним запросом, оно находит повторяющиеся столбцы и выдает ошибку.

Ответ 3

Вы указываете два одинаковых псевдонима для разных столбцов, которые будут отображаться как повторяющиеся столбцы в одной таблице.

Вот почему он дает ошибку.

Если вы сделаете его другим псевдонимом, тогда ошибка не произойдет. Попробуйте и сообщите мне, будет ли это работать или нет.

Ответ 4

Спасибо за все ваши ребята добрые ответы. Я согласен с Никилом Бутани. Вот мои мысли.

Мы все знаем основные правила о столбцах таблицы 1. Должно быть имя 2. Имя должно быть уникальным.

Первый запрос, который я предоставил

SELECT custid AAA, название компании AAA  ОТ Sales.Customers  WHERE страна = 'США'

- фактически РЕЗУЛЬТАТ. Это не таблица, поэтому не нужно соблюдать правила. Но когда я использую его как производную таблицу во втором запросе, она должна быть действительной таблицей. Правила столбцов применяются.

Вот более интересные вещи. Измените запрос 1 следующим образом

SELECT custid AAA, companyname + '' 
   FROM Sales.Customers
   WHERE country = 'USA'

Это делает второй столбец без имени, так как это выражение. Выполнение OK, поскольку это просто результат. Поместите его в производную таблицу

SELECT * FROM (
    SELECT custid AAA, companyname + '' 
       FROM Sales.Customers
       WHERE country = 'USA'
) AS AAA

SQL Server возвращает: имя столбца не было указано для столбца 2 "AAA".

Это также объясняет, почему в синтаксисе производных таблиц вы должны назначить псевдоним для таблицы (AS AAA), потому что таблица должна иметь имя.

Спасибо всем.