Therapyx
@Therapyx
Data Science

Почему не работает SQL запрос без...?

Собственно есть маленькая таблица категорий. Цель -> Выводить категории в DrowDownList основываясь на Session["UserID"]. Добавил тест данные.
[img]http://ipic.su/img/img7/fs/ask1.1440547824.jpg[/img] + Сам запрос
/*
exec usp_Category_Select '2'
*/
ALTER Procedure [dbo].[usp_Category_Select](
       @UserID int	          
       ) as
select Category.CategoryID, Category.Category, Category.UserID, [User].UserID
from [User], [Category] 
where @UserID = Category.UserID and [User].UserID = @UserID


Собственно вопрос: Почему если сравнивать "только" - where @UserID = Category.UserID без Category.UserID and [User].UserID = @UserID мне выводит все категории с ID 1 и 2 переиминовывая все это в ID = 1 или же 2, смотря какой Айди добавляю в параметр. В таблице Категорий ведь уже есть забитый айди, который я могу сравнить с айди, который находится в сессии, почему же не работает без второго сравнения? Получается так, что мне выдается таблица с двумя UserID. Интересно просто разобраться в этом нюансе :) А так работает все уже прекрасно. Но -> через метод тыка.
  • Вопрос задан
  • 355 просмотров
Решения вопроса 1
@heartdevil
плыву как воздушный шарик
Привет.

Все дело в том, что вы объединяете одним условием таблицы Users и Category, а вторым запросом фильтруете запись только по category относительно пользователя.

В вашем случае, если вам не нужны другие поля из таблицы users, вы можете вообще убрать эту таблицу из запроса.

То есть будет примерно так.

/*
exec usp_Category_Select '2'
*/
ALTER Procedure [dbo].[usp_Category_Select](
       @UserID int	          
       ) as
SELECT Category.CategoryID, Category.Category, Category.UserID
FROM [Category] 
WHERE Category.UserID = @UserID


Если вам нужен запрос пересечения двух таблиц, то лучше использовать INNER JOIN, чтобы у вас все было наглядно и не запутанно.

/*
exec usp_Category_Select '2'
*/
ALTER Procedure [dbo].[usp_Category_Select](
       @UserID int	          
       ) as
SELECT [Category].CategoryID, [Category].Category, [Category].UserID, [User].UserID
FROM [User]
INNER JOIN [Category] ON [User].UserID = [Category].UserID /* Это условие пересечения двух таблиц */
WHERE [Category].UserID = @UserID  /* Это условие фильтрации по полю UserID */
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы