Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Лишние записи в выборке  [new]
Manonia
Member

Откуда: Иркутск
Сообщений: 112
Привет! Не могу разобраться с запросом.

Табличка Users - userID, BankID, UserClassID.

Табличка Users_Routes - UserID(ссылается на Users.userID), RouteID, SiblingUserID(ссылается на Users.userID).

У меня есть уже результирующая выборка из т-цы Users(в частности, одно из условий - UserClassID = 5). Т.е. есть пользователи, теперь нужно определить, есть ли для этих юзеров запись в Users_Routes(соединение по SiblingUserID), при этом должно быть выполнено условие по @BankID(15).

select EU.UserID, IsMapped = IF U.ID IS NULL THEN 0 ELSE 1
from ExistingUsers EU
left join Users_Routes UR
on EU.UserID = US.SiblingUserID
left join Users U
on U.ID = UR.UserID and Users.BankID = @BankID

Например в Users_Routes есть записи:
UserID SiblingUserID
1 7
2 7
3 7

А в Users:
UserID BankID
1 15
2 15
3 16

В итоге получается 2 записи:
UserID IsMapped
7 1
7 NULL

Мне вторая запись не нужна, т.е. нужно вывести всех sibling юзеров, у которых есть юзер относится к тому же банку 15. Inner Join не подойдет, т.к. в любом случае нужно вывести siblinguser'ов.
4 ноя 14, 13:23    [16795732]     Ответить | Цитировать Сообщить модератору
 Re: Лишние записи в выборке  [new]
Edkonst2008
Member

Откуда:
Сообщений: 503
Manonia,

Inner join вместо left join?
4 ноя 14, 14:21    [16795927]     Ответить | Цитировать Сообщить модератору
 Re: Лишние записи в выборке  [new]
Wlr-l
Member

Откуда:
Сообщений: 606
Manonia, я понял Вашу задачу так:

 
declare @UserClassID  int = 5, @BankID int = 15; --параметры

with Users as ( --имитация вашей таблицы Users 
  select *
    from (values (1,15,5),
                 (2,15,5),
                 (3,16,5),
                 (4,20,1),
                 (5,21,2),
                 (6,22,3),
                 (7,15,5)
         ) as T(userID,BankID,UserClassID)
)

, Users_Routes as (--имитация вашей таблицы Users_Routes
  select *
    from (values (1,0,7),
                 (2,0,7),
                 (3,0,7),
                 (4,0,6)
         ) as T(UserID,RouteID,SiblingUserID)
)

select distinct SiblingUserID, 1 as IsMapped
  from Users_Routes su
 where exists (select *
                 from Users u
                where u.userID=su.UserID
                  and u.UserClassID=@UserClassID
                  and u.BankID=@BankID);


Результат:

SiblingUserID	IsMapped
7 1
4 ноя 14, 14:23    [16795930]     Ответить | Цитировать Сообщить модератору
 Re: Лишние записи в выборке  [new]
Manonia
Member

Откуда: Иркутск
Сообщений: 112
Wlr-l, понимаете, там для выборки юзеров уже есть приличный запрос(там тож соединяются несколько таблиц), и он правильный, осталось только столбец один высчитать... я думала это через join'ы сделать как то возможно...
4 ноя 14, 18:10    [16796849]     Ответить | Цитировать Сообщить модератору
 Re: Лишние записи в выборке  [new]
Wlr-l
Member

Откуда:
Сообщений: 606
Manonia, то, что можно сделать с помощью подзапросов, можно сделать и с помощью соединений таблиц.

У Вас проблема в самой озвученной постановке задачи.

7, 1 дают строки (1,0,7), (2,0,7) таблицы Users_Routes, т.к. есть юзеры из банка 15.
7,null дает строка (3,0,7) этой же таблицы, т.к. юзер НЕ из банка 15.

Т.е. результате должны быть одновременно две строки (7,1) и (7,0).
4 ноя 14, 18:22    [16796910]     Ответить | Цитировать Сообщить модератору
 Re: Лишние записи в выборке  [new]
Manonia
Member

Откуда: Иркутск
Сообщений: 112
Wlr-l,
Спасибо! Я сделала с подзапросом всё-таки )) Спрошу ещё, не подскажите ли ресурс, где можно хорошо по запросам прокачаться?
4 ноя 14, 23:31    [16798076]     Ответить | Цитировать Сообщить модератору
 Re: Лишние записи в выборке  [new]
MSSQLBug
Guest
Manonia,

http://www.sql-ex.ru/
5 ноя 14, 11:51    [16799702]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить