Неоднозначное имя столбца, оператор WHERE уже используется для других целей

Вопрос:Итак, у меня есть эта проблема, когда мне нужна INNER JOIN, чтобы подключить мою воображаемую к моей таблице продуктов, и я уже пытался указать каждое имя coloumn с подключением к таблицам, как вы можете видеть ниже. Когда дело доходит до моего заявления WHERE, это становится сложным. Поскольку мне нужно сохранить myIDID как переменную pid для

Вопрос:

Итак, у меня есть эта проблема, когда мне нужна INNER JOIN, чтобы подключить мою воображаемую к моей таблице продуктов, и я уже пытался указать каждое имя coloumn с подключением к таблицам, как вы можете видеть ниже. Когда дело доходит до моего заявления WHERE, это становится сложным. Поскольку мне нужно сохранить myIDID как переменную pid для других целей codebehind.

SELECT * FROM ProductTBL p INNER JOIN ImageTBL img on p.ProductID = img.ProductID WHERE (ProductID = @pid)

Когда я запустил этот код, он скажет мне, что ProductID – это неоднозначное имя столбца, и когда я пытаюсь
еще раз указать следующее выражение Where:

WHERE (p.ProductID = @pid)

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

Приветствуется любой вход:)

PS: im работает MSSQL, если есть что сказать.

Лучший ответ:

Я знаю два способа сделать это. 2-й способ, вероятно, рекомендуется (он должен работать быстрее).

Способ 1)

Запустите его в двухэтапном операторе. Я не думаю, что вы можете использовать * во внутреннем операторе SELECT:

SELECT * FROM ( SELECT p.ProductID, [other needed fields] FROM ProductTBL p INNER JOIN ImageTBL img on p.ProductID = img.ProductID ) as x WHERE (ProductID = @pid)

Внутренний SELECT p.ProductID говорит, что явным образом возвращает ProductID из ProductTBL. Это поле ProductID может быть использовано в вашем операторе WHERE, потому что оно находится во внешнем SQL-заявлении.

Способ 2)

Поместите критерии “WHERE” как часть соединения

SELECT * FROM ProductTBL p INNER JOIN ImageTBL img on p.ProductID = img.ProductID AND p.ProductID = @pid Ответ №1

Сообщение “неоднозначное имя столбца” является ошибкой SQL Server, и вы исправили его, указав “WHERE p.ProductID = @pid”. Да, вам нужен p. перед ProductID, потому что ImageTBL также имеет столбец с тем же именем.

Ошибка “нет данных” не исходит из SQL. У вас теперь есть правильный оператор SQL, но он, по-видимому, не возвращает никаких записей, по крайней мере для значения @pid, с которым вы его запускаете.

Вы вызываете это из приложения, которое пытается что-то сделать с данными, не так ли? Именно здесь происходит ошибка “нет данных”.

Вы можете разделить две части своей проблемы, запустив свои SQL-запросы в окне запросов SQL Server Management Studio и подключив требуемое значение для @pid. Затем вы можете запустить приложение в режиме отладки и проверить, получает ли он те же данные, что и в Management Studio. Здесь одна догадка: ваше приложение не передает @pid правильно, и оператор SQL возвращает записи, где p.ProductID = ”. Посмотрите, что происходит.

Ответ №2

Это может быть проблема с вашим кодом. Попробуйте запустить запрос с жестким ключевым значением идентификатора продукта и запустить его в консоли базы данных.

Это не проблема с базой данных

Ответ №3

Хорошо, ну, там, где проблема, у которой есть проблема. Вы должны префикс your productID своим псевдонимом таблицы. Псевдоним таблицы “хорош, я не сомневаюсь, что вы поняли, что когда вы набираете SELECT * From MyTable T, а затем возвращаетесь к выбору столбцов, вы получаете список столбцов intellisnce при замене * на T. Алиасинг-таблицы всегда хорошо. Скажем, у вас есть две таблицы T1 и T2 и столбцы C1, C2, C3 в T1 и C4, C5, C6 в T2. Вы script хранимую процедуру, и она работает. Когда-нибудь позже появится один и добавит столбец c с C2 до T2, тогда ваша процедура, вероятно, сломается, если вы не указали имя таблицы в столбцах. Поэтому, даже если нет текущей двусмысленности, и вы никогда не меняете свой сохраненный proc, использование префикса всегда более надежное.

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

Оцените статью
Добавить комментарий