Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / почему из 2х селектов один не работает? / 9 сообщений из 9, страница 1 из 1
12.07.2006, 13:55
    #33847976
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему из 2х селектов один не работает?
этот вариант работает:
Код: plaintext
1.
2.
3.
4.
5.
SELECT ;
   CaseTypes.Code,;
   CaseTypes.Name;
   from CaseTypes;
   WHERE CaseTypes.code NOT in (select JudgeCaseTypes.CaseType FROM JudgeCaseTypes);
   INTO CURSOR curAddableCaseTypes

а такой - нет, он отбрасывает только 1 запись, которая первая в базе JudgeCaseTypes
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT ;
   CaseTypes.Code,;
   CaseTypes.Name;
   FROM CaseTypes, JudgeCaseTypes;
   WHERE CaseTypes.code#JudgeCaseTypes.CaseType;
   INTO CURSOR curAddableCaseTypes
и этот тоже не пашет
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT ;
   CaseTypes.Code,;
   CaseTypes.Name;
   FROM CaseTypes;
   WHERE CaseTypes.code NOT in (JudgeCaseTypes.CaseType);
   INTO CURSOR curAddableCaseTypes

мне здесь что конкретно интересно - чтобы заработало нужно сделать select JudgeCaseTypes.CaseType FROM JudgeCaseTypes, а в базе JudgeCaseTypes и так всего одно поле и это CaseType. Почему селект не может использовать уже готовую базу для отсева?
...
Рейтинг: 0 / 0
12.07.2006, 14:25
    #33848128
Станислав C.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему из 2х селектов один не работает?
CTAC-KOэтот вариант работает:
Код: plaintext
1.
2.
3.
4.
5.
SELECT ;
   CaseTypes.Code,;
   CaseTypes.Name;
   from CaseTypes;
   WHERE CaseTypes.code NOT in (select JudgeCaseTypes.CaseType FROM JudgeCaseTypes);
   INTO CURSOR curAddableCaseTypes

а такой - нет, он отбрасывает только 1 запись, которая первая в базе JudgeCaseTypes
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT ;
   CaseTypes.Code,;
   CaseTypes.Name;
   FROM CaseTypes, JudgeCaseTypes;
   WHERE CaseTypes.code#JudgeCaseTypes.CaseType;
   INTO CURSOR curAddableCaseTypes
и этот тоже не пашет
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT ;
   CaseTypes.Code,;
   CaseTypes.Name;
   FROM CaseTypes;
   WHERE CaseTypes.code NOT in (JudgeCaseTypes.CaseType);
   INTO CURSOR curAddableCaseTypes

мне здесь что конкретно интересно - чтобы заработало нужно сделать select JudgeCaseTypes.CaseType FROM JudgeCaseTypes, а в базе JudgeCaseTypes и так всего одно поле и это CaseType. Почему селект не может использовать уже готовую базу для отсева?
Ну, я бы так категорично вопрос не ставил: ты же не знаешь внутренней реализации движка SQL в Фоксе...
А по запросам: итог выполнения вполне закономерен ибо используются операции с множествами.
Разберем твой запрос №2 (первый из тех, что "не пашет"). Предположим, что данные сравниваются последовательным просмотром, начиная с первой записи в каждой из таблиц.
берется первая запись в таблице CaseTypes (таблица А) и сравнивается с первой записью таблицы JudgeCaseTypes (таблица Б) по условию WHERE. Если записи равны, то в итоговую выборку запись из таблицы А не попадает, а если нет, то попадает - ведь условие WHERE соблюдено!!! То же самое со второй записью таблицы А. Она тоже сравнивается с первой записью таблицы Б....
В запросе №3 (второй из неработающих) даже не понятно, что имеется в виду. Я, например, не могу здесь найти явного указания на "множество значений", содержащих больше чем 1 элемент....
А вот запрос №1 удовлетворяет всем правилам операций с множествами... Поэтому он и работает...
...
Рейтинг: 0 / 0
12.07.2006, 14:54
    #33848278
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему из 2х селектов один не работает?
Насчет того что я не знаю механизма работы SELECT SQL - ты прав, но поэтому я и задаю вопрос

Ну вот смотри - в работающем примере
(select JudgeCaseTypes.CaseType FROM JudgeCaseTypes) что делает? Я так понимаю что он выбирает в какой-то временный курсор данные из таблицы JudgeCaseTypes и потом пользует данные полученного курсора? Так почему не взять сразу таблицу с теми же значениями и уже готовую?

в примере 3) я попытался указать столбец со значениями из базы JudgeCaseTypes - дык он тока берет во внимание первую запись из нее. А из курсора (select JudgeCaseTypes.CaseType FROM JudgeCaseTypes) берет все.

Или же тут дело в том, что селект будет для каждой записи CaseTypes создавать курсор посредством (select JudgeCaseTypes.CaseType FROM JudgeCaseTypes) и дальше по тексту? А смысл какой каждый раз заново создавать одно и то же? Особенно когда оно уже есть готовое. Особенно в плане быстродействия - такой вариант не самый оптимальный, как мне кажется.
...
Рейтинг: 0 / 0
12.07.2006, 15:05
    #33848342
Сталкер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему из 2х селектов один не работает?
На самом деле запрос отбрасывает первую запись потому, что при обращении к таблице именно первая запись является активной (если конечно не переместить указатель). Движок Фокса берет то значение, на котором указатель
...
Рейтинг: 0 / 0
12.07.2006, 18:14
    #33849132
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему из 2х селектов один не работает?
ну это мне понятно - потому только первую запись и отфильтровует, просто почему по курсору из вложенного селекта он ходит, а по базе также точно - не хочет. Я-то думал что захочет - ан нет!
...
Рейтинг: 0 / 0
13.07.2006, 08:30
    #33849718
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему из 2х селектов один не работает?
CTAC-KOэтот вариант работает:
Код: plaintext
1.
2.
3.
4.
5.
SELECT ;
   CaseTypes.Code,;
   CaseTypes.Name;
   from CaseTypes;
   WHERE CaseTypes.code NOT in (select JudgeCaseTypes.CaseType FROM JudgeCaseTypes);
   INTO CURSOR curAddableCaseTypes

Правильно написан - потому и работает.
CTAC-KOа такой - нет, он отбрасывает только 1 запись, которая первая в базе JudgeCaseTypes
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT ;
   CaseTypes.Code,;
   CaseTypes.Name;
   FROM CaseTypes, JudgeCaseTypes;
   WHERE CaseTypes.code#JudgeCaseTypes.CaseType;
   INTO CURSOR curAddableCaseTypes

Если как 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 ;
   CaseTypes.Code,;
   CaseTypes.Name;
   FROM CaseTypes;
   WHERE CaseTypes.code NOT in (JudgeCaseTypes.CaseType);
   INTO CURSOR curAddableCaseTypes

мне здесь что конкретно интересно - чтобы заработало нужно сделать select JudgeCaseTypes.CaseType FROM JudgeCaseTypes, а в базе JudgeCaseTypes и так всего одно поле и это CaseType. Почему селект не может использовать уже готовую базу для отсева?
Здесь не пашет, т.к. CaseTypes.code NOT in (JudgeCaseTypes.CaseType) означает для отбора взять не таблицу JudgeCaseTypes, а значение поля JudgeCaseTypes.CaseType текущей записи таблицы JudgeCaseTypes (т.е. первой если движения по таблице не было).

Если напрягает вложенный запрос, то:
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT distinct;
   CaseTypes.Code,;
   CaseTypes.Name;
   FROM CaseTypes left join JudgeCaseTypes on CaseTypes.code = JudgeCaseTypes.CaseType;
   WHERE isnull(JudgeCaseTypes.CaseType);
   INTO CURSOR curAddableCaseTypes
...
Рейтинг: 0 / 0
13.07.2006, 10:27
    #33849982
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему из 2х селектов один не работает?
Dima TЗдесь не пашет, т.к. CaseTypes.code NOT in (JudgeCaseTypes.CaseType) означает для отбора взять не таблицу JudgeCaseTypes, а значение поля JudgeCaseTypes.CaseType текущей записи таблицы JudgeCaseTypes (т.е. первой если движения по таблице не было).
вот в том-то все и дело, что берет не таблицу, а только первую запись - это мне и интересно. Как же ему сказать чтобы использовал не 1 запись а всю таблицу? Только вложенный селект помочь может и все? Ведь этот селект сделает точную копию таблицы, что уже существует - я просто не могу врубиться - зачем ему копия, если есть оригинал?
Dima T
Если напрягает вложенный запрос, то:
Код: plaintext
1.
2.
3.
4.
5.
SELECT distinct;
   CaseTypes.Code,;
   CaseTypes.Name;
   FROM CaseTypes left join JudgeCaseTypes on CaseTypes.code = JudgeCaseTypes.CaseType;
   WHERE isnull(JudgeCaseTypes.CaseType);
   INTO CURSOR curAddableCaseTypes

Нет, вложенный запрос меня не напрягает.
А в данном примере isnull(JudgeCaseTypes.CaseType) пройдет всю таблицу JudgeCaseTypes? т.е. если в in дать название поля, то оно использует только одну запись из таблицы, а если то же скормить isnull - то пройдут все записи таблицы?
...
Рейтинг: 0 / 0
13.07.2006, 14:28
    #33851117
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему из 2х селектов один не работает?
CTAC-KOвот в том-то все и дело, что берет не таблицу, а только первую запись - это мне и интересно. Как же ему сказать чтобы использовал не 1 запись а всю таблицу? Только вложенный селект помочь может и все? Ведь этот селект сделает точную копию таблицы, что уже существует - я просто не могу врубиться - зачем ему копия, если есть оригинал?
Поставь перед SELECT`ом:
Код: plaintext
GO  2  in JudgeCaseTypes
и будет использована 2-я запись :)
Твой запрос SELECT ... WHERE CaseTypes.code NOT in (JudgeCaseTypes.CaseType) ... равнозначен коду:
Код: plaintext
1.
lnCode = JudgeCaseTypes.CaseType
SELECT ... WHERE CaseTypes.code != lnCode ...
т.е. in (JudgeCaseTypes.CaseType) означает одно значение, а не таблицу. Синтаксис такой какой есть, а не такой какой хочется. Хочешь таблицу пиши in (select JudgeCaseTypes.CaseType FROM JudgeCaseTypes) .
CTAC-KO
Dima T
Если напрягает вложенный запрос, то:
Код: plaintext
1.
2.
3.
4.
5.
SELECT distinct;
   CaseTypes.Code,;
   CaseTypes.Name;
   FROM CaseTypes left join JudgeCaseTypes on CaseTypes.code = JudgeCaseTypes.CaseType;
   WHERE isnull(JudgeCaseTypes.CaseType);
   INTO CURSOR curAddableCaseTypes

Нет, вложенный запрос меня не напрягает.
А в данном примере isnull(JudgeCaseTypes.CaseType) пройдет всю таблицу JudgeCaseTypes? т.е. если в in дать название поля, то оно использует только одну запись из таблицы, а если то же скормить isnull - то пройдут все записи таблицы? В данном случае таблица JudgeCaseTypes указана как участвующая в запросе (есть во FROM), а в твоем случае ее там нет.

Вообще-то языком SQL можно задать что ты хочешь получить, а как получать решает движок. Это в стандарт SQL изначально заложено. Какие таблицы, каким образом будут пройдены зависит от плана выполнения запроса, который выбирает движок, ты единственно чем можешь ему помочь - создать необходимые индексы.
"in (select JudgeCaseTypes.CaseType FROM JudgeCaseTypes)" совсем не означает что будет создан отдельный курсор.
...
Рейтинг: 0 / 0
13.07.2006, 16:33
    #33851715
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему из 2х селектов один не работает?
ОК! Сенксь! Просто нужно запомнить что так как у меня не работает - просто неправильно, а указание поля БД в in() будет рассматриваться как 1 зачение в том поле...
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / почему из 2х селектов один не работает? / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]