Запрос внутреннего соединения SQL возвращает два одинаковых столбца - PullRequest
3 голосов
/ 23 августа 2011

Допустим, у меня есть следующий запрос SQL:

SELECT *
FROM employee 
INNER JOIN department ON employee.EmpID = department.EmpID

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

Я использую SQL-сервер

Ответы [ 6 ]

6 голосов
/ 23 августа 2011
SELECT employee.EmpID, employee.name, ...
FROM employee 
INNER JOIN department ON employee.EmpID=department.EmpID

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

5 голосов
/ 23 августа 2011

Вы получаете все столбцы из этих двух таблиц, поэтому у вас есть два EmpID столбца.Единственный тип JOIN, который удаляет общий столбец, - это NATURAL JOIN, который не реализован в SQL Server.Тогда ваш запрос будет выглядеть так:

SELECT *
FROM employee 
NATURAL JOIN department

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

1 голос
/ 23 августа 2011

Вы получаете все столбцы из всех таблиц , участвующих в запросе, поскольку вы его запрашиваете: SELECT *

Если вы хотите только определенный столбец - вам нужно указать, какие вы хотите:

SELECT e.EmpID, e.Name as 'Employee Name', d.Name AS 'Department Name'
FROM employee e 
INNER JOIN department d ON e.EmpID = d.EmpID
0 голосов
/ 23 августа 2011

По сути, ответ на ваш вопрос заключается в том, что вывод запроса SQL SELECT не является отношением, и поэтому, если вы не позаботитесь о нем, вы можете получить дубликаты имен атрибутов (столбцов) и строк.

Стандартный SQL имеет некоторые конструкции для смягчения нереляционных проблем SQL, например. NATURAL JOIN гарантирует, что результат будет иметь только один атрибут EmpID. К сожалению, SQL Server не поддерживает этот синтаксис, но вы можете проголосовать за него здесь .

Таким образом, вы вынуждены записывать в колонки нужные вам столбцы, используя имя таблицы, чтобы определить, какой атрибут вы предпочитаете, например. employee.EmpID.

0 голосов
/ 23 августа 2011

Как заявили другие, не используйте *

См. Этот вопрос SO по причинам, почему:

Что быстрее / лучше?SELECT * или SELECT столбец1, столбец2, столбец3 и т. Д.

0 голосов
/ 23 августа 2011

Не используйте *. Укажите нужные столбцы в списке полей.

SELECT E.EmpID, E.EmpName -- etc 
FROM employee as E
  INNER JOIN department as D
    ON E.EmpID=D.EmpID
...