|
|
|
почему из 2х селектов один не работает?
|
|||
|---|---|---|---|
|
#18+
этот вариант работает: Код: plaintext 1. 2. 3. 4. 5. а такой - нет, он отбрасывает только 1 запись, которая первая в базе JudgeCaseTypes Код: plaintext 1. 2. 3. 4. 5. 6. Код: plaintext 1. 2. 3. 4. 5. 6. мне здесь что конкретно интересно - чтобы заработало нужно сделать select JudgeCaseTypes.CaseType FROM JudgeCaseTypes, а в базе JudgeCaseTypes и так всего одно поле и это CaseType. Почему селект не может использовать уже готовую базу для отсева? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2006, 13:55 |
|
||
|
почему из 2х селектов один не работает?
|
|||
|---|---|---|---|
|
#18+
CTAC-KOэтот вариант работает: Код: plaintext 1. 2. 3. 4. 5. а такой - нет, он отбрасывает только 1 запись, которая первая в базе JudgeCaseTypes Код: plaintext 1. 2. 3. 4. 5. 6. Код: plaintext 1. 2. 3. 4. 5. 6. мне здесь что конкретно интересно - чтобы заработало нужно сделать select JudgeCaseTypes.CaseType FROM JudgeCaseTypes, а в базе JudgeCaseTypes и так всего одно поле и это CaseType. Почему селект не может использовать уже готовую базу для отсева? Ну, я бы так категорично вопрос не ставил: ты же не знаешь внутренней реализации движка SQL в Фоксе... А по запросам: итог выполнения вполне закономерен ибо используются операции с множествами. Разберем твой запрос №2 (первый из тех, что "не пашет"). Предположим, что данные сравниваются последовательным просмотром, начиная с первой записи в каждой из таблиц. берется первая запись в таблице CaseTypes (таблица А) и сравнивается с первой записью таблицы JudgeCaseTypes (таблица Б) по условию WHERE. Если записи равны, то в итоговую выборку запись из таблицы А не попадает, а если нет, то попадает - ведь условие WHERE соблюдено!!! То же самое со второй записью таблицы А. Она тоже сравнивается с первой записью таблицы Б.... В запросе №3 (второй из неработающих) даже не понятно, что имеется в виду. Я, например, не могу здесь найти явного указания на "множество значений", содержащих больше чем 1 элемент.... А вот запрос №1 удовлетворяет всем правилам операций с множествами... Поэтому он и работает... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2006, 14:25 |
|
||
|
почему из 2х селектов один не работает?
|
|||
|---|---|---|---|
|
#18+
Насчет того что я не знаю механизма работы SELECT SQL - ты прав, но поэтому я и задаю вопрос Ну вот смотри - в работающем примере (select JudgeCaseTypes.CaseType FROM JudgeCaseTypes) что делает? Я так понимаю что он выбирает в какой-то временный курсор данные из таблицы JudgeCaseTypes и потом пользует данные полученного курсора? Так почему не взять сразу таблицу с теми же значениями и уже готовую? в примере 3) я попытался указать столбец со значениями из базы JudgeCaseTypes - дык он тока берет во внимание первую запись из нее. А из курсора (select JudgeCaseTypes.CaseType FROM JudgeCaseTypes) берет все. Или же тут дело в том, что селект будет для каждой записи CaseTypes создавать курсор посредством (select JudgeCaseTypes.CaseType FROM JudgeCaseTypes) и дальше по тексту? А смысл какой каждый раз заново создавать одно и то же? Особенно когда оно уже есть готовое. Особенно в плане быстродействия - такой вариант не самый оптимальный, как мне кажется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2006, 14:54 |
|
||
|
почему из 2х селектов один не работает?
|
|||
|---|---|---|---|
|
#18+
На самом деле запрос отбрасывает первую запись потому, что при обращении к таблице именно первая запись является активной (если конечно не переместить указатель). Движок Фокса берет то значение, на котором указатель ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2006, 15:05 |
|
||
|
почему из 2х селектов один не работает?
|
|||
|---|---|---|---|
|
#18+
ну это мне понятно - потому только первую запись и отфильтровует, просто почему по курсору из вложенного селекта он ходит, а по базе также точно - не хочет. Я-то думал что захочет - ан нет! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2006, 18:14 |
|
||
|
почему из 2х селектов один не работает?
|
|||
|---|---|---|---|
|
#18+
CTAC-KOэтот вариант работает: Код: plaintext 1. 2. 3. 4. 5. Правильно написан - потому и работает. CTAC-KOа такой - нет, он отбрасывает только 1 запись, которая первая в базе JudgeCaseTypes Код: plaintext 1. 2. 3. 4. 5. 6. Если как FPD 2.x обрабатыватся (в FPD не было join`ов) и принцип был следующий: FROM CaseTypes, JudgeCaseTypes означает выборка из таблицы где все записи первой сопоставлены со всеми записями второй, т.е. общее кол-во записей до фильтра = кол-во записей (CaseTypes) * кол-во записей (JudgeCaseTypes). Соответственно после WHERE CaseTypes.code#JudgeCaseTypes.CaseType должны остаться куча повторяющихся записей из CaseTypes. Как вариант (это мое предположение) раз выбираются только поля CaseTypes, то указание на JudgeCaseTypes во FROM движок проигнорировал ("оптимизировал") и соответственно сравнивал со значением текущей записи JudgeCaseTypes.CaseType, которая при открытии первая. Так писать я бы не советовал, даже если результат правильный будет. CTAC-KO и этот тоже не пашет Код: plaintext 1. 2. 3. 4. 5. 6. мне здесь что конкретно интересно - чтобы заработало нужно сделать select JudgeCaseTypes.CaseType FROM JudgeCaseTypes, а в базе JudgeCaseTypes и так всего одно поле и это CaseType. Почему селект не может использовать уже готовую базу для отсева? Здесь не пашет, т.к. CaseTypes.code NOT in (JudgeCaseTypes.CaseType) означает для отбора взять не таблицу JudgeCaseTypes, а значение поля JudgeCaseTypes.CaseType текущей записи таблицы JudgeCaseTypes (т.е. первой если движения по таблице не было). Если напрягает вложенный запрос, то: Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2006, 08:30 |
|
||
|
почему из 2х селектов один не работает?
|
|||
|---|---|---|---|
|
#18+
Dima TЗдесь не пашет, т.к. CaseTypes.code NOT in (JudgeCaseTypes.CaseType) означает для отбора взять не таблицу JudgeCaseTypes, а значение поля JudgeCaseTypes.CaseType текущей записи таблицы JudgeCaseTypes (т.е. первой если движения по таблице не было). вот в том-то все и дело, что берет не таблицу, а только первую запись - это мне и интересно. Как же ему сказать чтобы использовал не 1 запись а всю таблицу? Только вложенный селект помочь может и все? Ведь этот селект сделает точную копию таблицы, что уже существует - я просто не могу врубиться - зачем ему копия, если есть оригинал? Dima T Если напрягает вложенный запрос, то: Код: plaintext 1. 2. 3. 4. 5. Нет, вложенный запрос меня не напрягает. А в данном примере isnull(JudgeCaseTypes.CaseType) пройдет всю таблицу JudgeCaseTypes? т.е. если в in дать название поля, то оно использует только одну запись из таблицы, а если то же скормить isnull - то пройдут все записи таблицы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2006, 10:27 |
|
||
|
почему из 2х селектов один не работает?
|
|||
|---|---|---|---|
|
#18+
CTAC-KOвот в том-то все и дело, что берет не таблицу, а только первую запись - это мне и интересно. Как же ему сказать чтобы использовал не 1 запись а всю таблицу? Только вложенный селект помочь может и все? Ведь этот селект сделает точную копию таблицы, что уже существует - я просто не могу врубиться - зачем ему копия, если есть оригинал? Поставь перед SELECT`ом: Код: plaintext Твой запрос SELECT ... WHERE CaseTypes.code NOT in (JudgeCaseTypes.CaseType) ... равнозначен коду: Код: plaintext 1. CTAC-KO Dima T Если напрягает вложенный запрос, то: Код: plaintext 1. 2. 3. 4. 5. Нет, вложенный запрос меня не напрягает. А в данном примере isnull(JudgeCaseTypes.CaseType) пройдет всю таблицу JudgeCaseTypes? т.е. если в in дать название поля, то оно использует только одну запись из таблицы, а если то же скормить isnull - то пройдут все записи таблицы? В данном случае таблица JudgeCaseTypes указана как участвующая в запросе (есть во FROM), а в твоем случае ее там нет. Вообще-то языком SQL можно задать что ты хочешь получить, а как получать решает движок. Это в стандарт SQL изначально заложено. Какие таблицы, каким образом будут пройдены зависит от плана выполнения запроса, который выбирает движок, ты единственно чем можешь ему помочь - создать необходимые индексы. "in (select JudgeCaseTypes.CaseType FROM JudgeCaseTypes)" совсем не означает что будет создан отдельный курсор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2006, 14:28 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33848342&tid=1591233]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
155ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
| others: | 244ms |
| total: | 498ms |

| 0 / 0 |
