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

Откуда: Тольятти
Сообщений: 424
Добрый день!

Есть простой запрос:
DECLARE @otID int = -4990;

        SELECT otAPB, otName, otAddress, otAddressR, otPhones, otName1, otSkid, otEmail, goID, otBAD, otSumOst, otBoss, otINN, otOKPO, otDesc As otDescPhone, Otdel.usiID, otKPP,
               otNew, otPassSer, otPassNom, otPassDate, otPassKem, otIDPlat, otBD, otDate,
               otCredit, otCreditDate, otPhoneCell, otClose,
               usKey,
               DCard.dcID, dcNomer, dcSkid
        FROM Otdel WITH (noLock)
            LEFT OUTER JOIN Users WITH(noLock) ON Users.otID = Otdel.ID
            LEFT OUTER JOIN DCard WITH(noLock) ON Otdel.ID = DCard.otID
        WHERE Otdel.ID = @otID;


При выполнении запроса, в плане, пишется предупреждение "No Join Predicate". С чем это связано и как с этим можно побороться?

К сообщению приложен файл (noJoinPredicate.sqlplan - 51Kb) cкачать
23 авг 16, 14:24    [19578913]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос и проблема с join  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5451
saszay,

насколько я понимаю, то оптимизатор уже пробросил в запросы джоина переменную @otID и в результате больше нет условий, ну и имхо это не проблема
23 авг 16, 14:36    [19579026]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос и проблема с join  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7365
saszay,

в Users может быть несколько строк с одинаковым otID? в DCard может быть несколько строк с одинаковым otID?
если на оба вопроса ответ "да", то у вас, вероятно, проблемы с логикой запроса.
23 авг 16, 14:47    [19579151]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос и проблема с join  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5451
daw
saszay,

в Users может быть несколько строк с одинаковым otID? в DCard может быть несколько строк с одинаковым otID?
если на оба вопроса ответ "да", то у вас, вероятно, проблемы с логикой запроса.

ммм а почему "да" это проблема логики?
23 авг 16, 14:53    [19579204]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос и проблема с join  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 35690
TaPaK
daw
saszay,

в Users может быть несколько строк с одинаковым otID? в DCard может быть несколько строк с одинаковым otID?
если на оба вопроса ответ "да", то у вас, вероятно, проблемы с логикой запроса.

ммм а почему "да" это проблема логики?
Сервер намекает, что будет декартово произведение Users * DCard для одного отдела. Как по мне, мешать в кучу несвязанный набор пользователей и набор дисконтных карт странно.
23 авг 16, 15:01    [19579267]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос и проблема с join  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5451
Гавриленко Сергей Алексеевич
TaPaK
пропущено...

ммм а почему "да" это проблема логики?
Сервер намекает, что будет декартово произведение Users * DCard для одного отдела. Как по мне, мешать в кучу несвязанный набор пользователей и набор дисконтных карт странно.

ну так вопрос желания клиента :)
23 авг 16, 15:05    [19579290]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос и проблема с join  [new]
saszay
Member

Откуда: Тольятти
Сообщений: 424
daw,

Одинаковых нет
23 авг 16, 15:08    [19579320]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос и проблема с join  [new]
o-o
Guest
Гавриленко Сергей Алексеевич
мешать в кучу несвязанный набор пользователей и набор дисконтных карт странно.

а что, люди нынче дачами меняются, супругами и т.д.
а тут взяли и меняются карточками, это сейчас в моде.
а что всем отделом это делают, тоже понятно: выбор карточек больше.
остается распечатать декартов квадрат и пустить по кругу,
чтобы каждый проставил крестик,
какую карточку он себе на завтра выбирает
23 авг 16, 15:09    [19579332]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос и проблема с join  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5451
o-o
Гавриленко Сергей Алексеевич
мешать в кучу несвязанный набор пользователей и набор дисконтных карт странно.

а что, люди нынче дачами меняются, супругами и т.д.
а тут взяли и меняются карточками, это сейчас в моде.
а что всем отделом это делают, тоже понятно: выбор карточек больше.
остается распечатать декартов квадрат и пустить по кругу,
чтобы каждый проставил крестик,
какую карточку он себе на завтра выбирает

так мы и до пестиков с тычинками докатимся )
23 авг 16, 15:11    [19579348]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос и проблема с join  [new]
saszay
Member

Откуда: Тольятти
Сообщений: 424
[quot Гавриленко Сергей Алексеевич]
TaPaK
пропущено...

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


У клиента может быть дисконтная карта и он может быть сотрудником фирмы. И такое бывает :)
23 авг 16, 15:13    [19579363]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос и проблема с join  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5451
[quot saszay]
Гавриленко Сергей Алексеевич
пропущено...


У клиента может быть дисконтная карта и он может быть сотрудником фирмы. И такое бывает :)

не так: у отдела может не быть человека и у отдела может не быть карточки, теперь всё это в ведро и отдаём заказчику :)
23 авг 16, 15:15    [19579377]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос и проблема с join  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7365
> Одинаковых нет

тогда, почему нет уникального индекса на otID?

> У клиента может быть дисконтная карта и он может быть сотрудником фирмы. И такое бывает :)

так почему у вас тогда DCard только с Otdel связана - где завязка DCard на Users?
23 авг 16, 15:46    [19579606]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос и проблема с join  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5451
daw
> Одинаковых нет

тогда, почему нет уникального индекса на otID?

> У клиента может быть дисконтная карта и он может быть сотрудником фирмы. И такое бывает :)

так почему у вас тогда DCard только с Otdel связана - где завязка DCard на Users?

а связь должна быть? может это таблица синих и таблица зелёных в отделе?
23 авг 16, 16:05    [19579809]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос и проблема с join  [new]
o-o
Guest
ему надо картинкой простыню показать,
не понимает, что получил в результате.
товарищ, вот так выглядит результат скрещения юзеров с карточками.
хотя чисто внешне все лепили к отделу
DECLARE @otID int = -4990;

declare @o table (ID int);
insert into @o values (-4990);

declare @u table (otID int, u varchar(10));
insert into @u values (-4990, 'Vasja'), (-4990, 'Petja');

declare @c table (otID int, c varchar(10));
insert into @c values (-4990, 'Conad'), (-4990, 'Lidl'), (-4990, 'Sma');

SELECT Users.u, DCard.c
FROM @o Otdel 
    LEFT OUTER JOIN @u Users ON Users.otID = Otdel.ID
    LEFT OUTER JOIN @c DCard ON Otdel.ID = DCard.otID
WHERE Otdel.ID = @otID;
-----------
u	c
Vasja	Conad
Vasja	Lidl
Vasja	Sma
Petja	Conad
Petja	Lidl
Petja	Sma
23 авг 16, 16:12    [19579851]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос и проблема с join  [new]
o-o
Guest
причем нам всем понятно, что это график проката карточек,
в отделе все общее и каждый может любyю карточку себе взять
(не хватает поля с галочкой, кто какую выбрал)
но серверу кажется,
что это какой-то бред,
ибо это скрещивание и писать его надо через CROSS JOIN, не пудря никому мозги LEFT JOIN-ами:
SELECT Users.u, DCard.c
FROM @o Otdel, 
     @u Users,
     @c DCard
WHERE Otdel.ID = @otID;
23 авг 16, 16:16    [19579878]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос и проблема с join  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5451
никто не знает, что же нужно ТС, вопрос он задал другой, но все что то предполагают. Ещё версия : есть люди которые не записаны в отделе , отдел раздаёт карты(топографические). ТС хочет получить варианты карт которые не раздавались и выгодно продать эту информацию
23 авг 16, 16:20    [19579904]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос и проблема с join  [new]
o-o
Guest
TaPaK
вопрос он задал другой

на его вопрос уже отвечено:
ваш таксидермист вовсе не министр, он на такси дерьмо развозит
его LEFT JOIN-ы это замаскированный CROSS JOIN,
в котором нет условия соединения.
так что кто не хочет нытья сервера по этому поводу, переписывает через CROSS JOIN,
потому что если даже написал какие-то условия, которые совсем и не условия LEFT-соединения, то ССЗБ
23 авг 16, 16:28    [19579968]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить