Вопрос:
Итак, у меня есть эта проблема, когда мне нужна 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.