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), потому что таблица должна иметь имя.
Спасибо всем.