#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