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

Откуда:
Сообщений: 20504
Сорри, что опять туплю, но дела такие:

SELECT C.[IdSubj]
FROM [subj].[Company] C
WHERE C.IdSubj NOT IN (SELECT CD.[IdSubj] FROM [ws].[CompanyDraft] CD);

SELECT DISTINCT C.[IdSubj]
FROM [subj].[Company] C

SELECT [IdSubj] FROM [ws].[CompanyDraft]



(0 row(s) affected)

(12301 row(s) affected)

(3600 row(s) affected)


Как такое может быть?
17 апр 13, 12:01    [14191597]     Ответить | Цитировать Сообщить модератору
 Re: Не понял запрос  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
defragmentator, ну а что смущает то ?
Нет у вас записей в Company для которых нет CompanyDraft
17 апр 13, 12:04    [14191620]     Ответить | Цитировать Сообщить модератору
 Re: Не понял запрос  [new]
Glory
Member

Откуда:
Сообщений: 104751
Наверное
SELECT DISTINCT [IdSubj] FROM [ws].[CompanyDraft] выдаст тоже 12301 ?
17 апр 13, 12:05    [14191627]     Ответить | Цитировать Сообщить модератору
 Re: Не понял запрос  [new]
qwrqwr
Member

Откуда: Msk
Сообщений: 1684
defragmentator,

если в списке CD.[IdSubj] есть NULL - первый ваш запрос вернет пустое множество.
17 апр 13, 12:06    [14191633]     Ответить | Цитировать Сообщить модератору
 Re: Не понял запрос  [new]
defragmentator
Member

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

фраза "Нет записей в Company" (их 12000 различных)
и
фраза " для которых нет CompanyDraft" (их 3600)

Ничего не смущает?
17 апр 13, 12:07    [14191641]     Ответить | Цитировать Сообщить модератору
 Re: Не понял запрос  [new]
Glory
Member

Откуда:
Сообщений: 104751
defragmentator
фраза " для которых нет CompanyDraft" (их 3600)

3600 записей не означает 3600 уникальных [IdSubj]
17 апр 13, 12:08    [14191650]     Ответить | Цитировать Сообщить модератору
 Re: Не понял запрос  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
Glory
Наверное
SELECT DISTINCT [IdSubj] FROM [ws].[CompanyDraft] выдаст тоже 12301 ?

Если бы :)
17 апр 13, 12:08    [14191653]     Ответить | Цитировать Сообщить модератору
 Re: Не понял запрос  [new]
Maxx
Member [скрыт]

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

И ? Ктож знает что вы там строили то ?
Может у вас 1 CompanyDraft может ссылаться на 4 ре Company
17 апр 13, 12:08    [14191654]     Ответить | Цитировать Сообщить модератору
 Re: Не понял запрос  [new]
Glory
Member

Откуда:
Сообщений: 104751
defragmentator
Если бы :)

Это типа честное пионерское, зуб даю ?
17 апр 13, 12:09    [14191658]     Ответить | Цитировать Сообщить модератору
 Re: Не понял запрос  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
qwrqwr
defragmentator,

если в списке CD.[IdSubj] есть NULL - первый ваш запрос вернет пустое множество.



есть NULL. А почему пустое множество?
17 апр 13, 12:11    [14191675]     Ответить | Цитировать Сообщить модератору
 Re: Не понял запрос  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
Glory
defragmentator
Если бы :)

Это типа честное пионерское, зуб даю ?


SELECT DISTINCT [IdSubj] FROM [ws].[CompanyDraft]

(1454 row(s) affected)
17 апр 13, 12:12    [14191697]     Ответить | Цитировать Сообщить модератору
 Re: Не понял запрос  [new]
qwrqwr
Member

Откуда: Msk
Сообщений: 1684
defragmentator
есть NULL. А почему пустое множество?
Потому что not in(...) раскладывается в цепочку неравенств соединенных AND-ом.
Если одно неравенство дает unknown - вся цепочка тоже unknown.

При not in(...) это самые известные грабли.
17 апр 13, 12:13    [14191706]     Ответить | Цитировать Сообщить модератору
 Re: Не понял запрос  [new]
Glory
Member

Откуда:
Сообщений: 104751
defragmentator
SELECT DISTINCT [IdSubj] FROM [ws].[CompanyDraft]


(1454 row(s) affected)

а теперь
SELECT COUNT(*), COUNT(DISTINCT [IdSubj]) FROM [ws].[CompanyDraft]
17 апр 13, 12:13    [14191710]     Ответить | Цитировать Сообщить модератору
 Re: Не понял запрос  [new]
Glory
Member

Откуда:
Сообщений: 104751
defragmentator
(1454 row(s) affected)

1454 записи меньше, чем 12301
17 апр 13, 12:14    [14191716]     Ответить | Цитировать Сообщить модератору
 Re: Не понял запрос  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
Maxx
defragmentator,

И ? Ктож знает что вы там строили то ?
Может у вас 1 CompanyDraft может ссылаться на 4 ре Company

И как Вы это себе представляете, исходя из
SELECT CD.[IdSubj] FROM [ws].[CompanyDraft] CD
?
17 апр 13, 12:15    [14191725]     Ответить | Цитировать Сообщить модератору
 Re: Не понял запрос  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
Glory
defragmentator
(1454 row(s) affected)

1454 записи меньше, чем 12301

В том - то и дело
17 апр 13, 12:17    [14191742]     Ответить | Цитировать Сообщить модератору
 Re: Не понял запрос  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
Glory
defragmentator
SELECT DISTINCT [IdSubj] FROM [ws].[CompanyDraft]


(1454 row(s) affected)

а теперь
SELECT COUNT(*), COUNT(DISTINCT [IdSubj]) FROM [ws].[CompanyDraft]

3600 1453
17 апр 13, 12:18    [14191754]     Ответить | Цитировать Сообщить модератору
 Re: Не понял запрос  [new]
Glory
Member

Откуда:
Сообщений: 104751
defragmentator
3600 1453

1453 ! А с NULL будет 1454
17 апр 13, 12:19    [14191761]     Ответить | Цитировать Сообщить модератору
 Re: Не понял запрос  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
qwrqwr
defragmentator
есть NULL. А почему пустое множество?
Потому что not in(...) раскладывается в цепочку неравенств соединенных AND-ом.
Если одно неравенство дает unknown - вся цепочка тоже unknown.

При not in(...) это самые известные грабли.

А чем можно заменить?
17 апр 13, 12:22    [14191791]     Ответить | Цитировать Сообщить модератору
 Re: Не понял запрос  [new]
Гость333
Member

Откуда:
Сообщений: 3683
defragmentator
А чем можно заменить?

NOT EXISTS
либо
LEFT JOIN + IS NULL
либо
EXCEPT
либо
NOT IN (SELECT ... WHERE IdSubj IS NOT NULL)
17 апр 13, 12:24    [14191809]     Ответить | Цитировать Сообщить модератору
 Re: Не понял запрос  [new]
qwrqwr
Member

Откуда: Msk
Сообщений: 1684
defragmentator,
WHERE C.IdSubj NOT IN (SELECT CD.[IdSubj] FROM [ws].[CompanyDraft] CD where CD.[IdSubj] is not null );
17 апр 13, 12:25    [14191820]     Ответить | Цитировать Сообщить модератору
 Re: Не понял запрос  [new]
defragmentator
Member

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

СПАСИБО
17 апр 13, 12:27    [14191841]     Ответить | Цитировать Сообщить модератору
 Re: Не понял запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
qwrqwr
defragmentator,
WHERE C.IdSubj NOT IN (SELECT CD.[IdSubj] FROM [ws].[CompanyDraft] CD where CD.[IdSubj] is not null );
А с C.IdSubj, которые IS NULL как быть, а?
Что-то не то советуете.
Логичнее так, наверно:
WHERE NOT EXISTS(SELECT C.IdSubj INTERSECT SELECT CD.[IdSubj] FROM [ws].[CompanyDraft] CD)
17 апр 13, 12:38    [14191989]     Ответить | Цитировать Сообщить модератору
 Re: Не понял запрос  [new]
qwrqwr
Member

Откуда: Msk
Сообщений: 1684
iap
Логичнее так, наверно:
[/src]

Логичнее - это когда поля с префиксом Id не могут содержать NULL.
А тут логичного и вовсе ничего нет, просто симптомы были очень уж характерными.
17 апр 13, 12:42    [14192030]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить