Неоднозначное имя столбца — что здесь не так с синтаксисом?

#sql #sql-server #tsql

Вопрос:

Кажется, я не могу понять, что не так с SQL здесь, когда звездочка (*) включена в оператор SELECT . например:

 SELECT firstname, lastname, createdon, * from Person
Where firstname like '%J%'
Order By createdon desc
 

Я получаю ‘Неоднозначное имя столбца ‘CreatedOn’. ошибка.

Однако без (*), где он не возвращает оставшуюся часть столбцов, он работает нормально.

Любое предложение или обходной путь?

Комментарии:

1. Order By 3 desc потому что это 3-й столбец в выборе.

2. удалите * и перечислите каждое из полей, которые вы хотите отобразить. анализатор не может разрешить * createdon и перечисленный createdon

3. Рекомендуемое чтение, @shahkalpesh: Вредные привычки, от которых нужно избавиться: ПОРЯДОК ПО порядковому номеру

4. @Larnu: Спасибо. Я предложил это в качестве обходного пути и предполагаю, что это может быть один из sql, а не что-то, что было бы частью хранимых процедур / функций.

5. @shahkalpesh Нет, это плохая идея, потому что теперь любой, кто когда-либо будет поддерживать код в будущем, должен знать, что если они каким-либо образом изменят список ВЫБОРА, им также придется изменить произвольное число, используемое в ORDER BY . И это не тот тип сбоя, который вы обнаружите в модульном тестировании, потому что он не потерпит неудачу, он просто будет вести себя по-другому. И ИМХО, это не очень хорошее решение для возврата CreatedOn дважды с двумя разными псевдонимами, чтобы просто сохранить * . Правильный ответ — прекратить использование * и возвращать каждый столбец только один раз.

Ответ №1:

createdon находится в возвращаемом наборе данных дважды, один раз из явного вызова и один раз из * . Таким образом, существует 2 столбца с именем createdon , и поэтому ORDER BY createdon они неоднозначны; вы хотите упорядочить по первому названному столбцу createdon или по второму (тот факт, что они будут иметь одинаковое значение, не имеет значения, поскольку SQL Server просто видит 2 столбца с одинаковым именем).

Действительно, вы не должны использовать SELECT * и должны определять все свои столбцы; Я не вижу необходимости возвращать 3 столбца дважды. Но что вы можете сделать, если у вас «должно» быть 2 копии одного и того же столбца ORDER BY , так это добавить к тому, что находится в, имя / псевдоним таблицы; тогда это будет ссылаться на столбец «в» таблице, а не на столбец в результирующем наборе (которых 2). Здесь я использую псевдоним:

 SELECT P.firstname,
       P.lastname,
       P.createdon,
       * --Replace this with the actual columns you need, don't be lazy
FROM dbo.Person P
WHERE P.firstname like '%J%'
ORDER BY P.createdon DESC;
 

Ответ №2:

В вашем запросе вы дважды выбираете столбец «createdon» и упорядочиваете результаты по «одному из них». Интерпретатор SQL не понимает, в каком столбце «createdon» ему нужно отсортировать результат, и поэтому возвращается неоднозначное имя столбца. Вы можете решить эту проблему, используя псевдоним одного из «createdon» в инструкции selected.

Ответ №3:

я не уверен, но попробуйте с этим

ВЫБЕРИТЕ firstname, lastname, createdon createdon2, * от Person, где firstname как ‘%J%’ Порядок по createdon desc