26.05.2004, 11:03 | #1 |
NavAx
|
Странное поведение Join
Привет.
Натолкнулся на совершенно непонятную проблему, связанную с использованием простейшей конструкцией: PHP код:
в table1 - 1 запись, в table2 - 2 записи, соответствующие условию запроса Как должно работать: все знают - выбор поочередно обеих записей из table2, соответствующий условию. Как работает: выбор поочередно одной и тойже записи из table2 при неизменном курсоре в table1, ну и table3, разумеется . В чем может быть проблема? Запускал индексацию, проверку \ синхронизацию, игрался с индексами - не помогает.
__________________
Чудес не бывает (c), истина где-то рядом (c)... |
|
26.05.2004, 11:32 | #2 |
Участник
|
А что будет если поменять порядок следования таблиц в запросе?
PHP код:
|
|
26.05.2004, 11:52 | #3 |
Модератор
|
Цитата:
Изначально опубликовано dn
А что будет если поменять порядок следования таблиц в запросе? |
|
26.05.2004, 11:56 | #4 |
Модератор
|
И еще не пойму - зачем при
PHP код:
С чего бы это форум && стал херить? Раньше такого не было |
|
26.05.2004, 12:15 | #5 |
Участник
|
Цитата:
С чего бы это форум && стал херить? Раньше такого не было
будем разбираться. Спасибо |
|
26.05.2004, 12:19 | #6 |
NavAx
|
Цитата:
Изначально опубликовано Vadic
Ничего не будет, если forceselectorder не использовать. Если оптимизатор сам не справляется, значит, с индексами не все в порядке По поводу order by - взял реализацию одного из классов по российской локализации, dis слой. Попробовал также перестроить индексы приложения - результат тот же. ничего не меняется. маленькое дополнение: внутри цикла происходит присваивание курсоора: sourceTable = table2; и далее обработка уже sourceTable ( тип Common.) Я к тому ,что написав подобным образом job, но без переприсваиваний через common, результат выборки становился верным. Какие мысли по этому поводу?
__________________
Чудес не бывает (c), истина где-то рядом (c)... |
|
26.05.2004, 12:28 | #7 |
Модератор
|
Возникло ощущение, что я спросонья не на то отвечаю
А в чем собственно проблема? Если брать пример (table1 - одна запись, table2 - две записи), результат у Вашего запроса будет такой: Table1.RecId Table2.RecId Table1.Field1 Table2.Field1 Table2.Field2 1 100 Вася Вася Петя 1 101 Вася Вася Петя Собственно, это Вы и наблюдаете. What's Up, Doc? (c) Bugs Bunny |
|
26.05.2004, 12:28 | #8 |
NavAx
|
sourceTable = table2;
Этим вы просто делаете ссылку на курсор и вся дальнейшая работа касается и table2 Если вам нужна копия записи делайте sourceTable = table2.data().
__________________
С уважением, Игорь Ласийчук. |
|
26.05.2004, 12:33 | #9 |
Модератор
|
Цитата:
Изначально опубликовано Ser
Я к тому ,что написав подобным образом job, но без переприсваиваний через common, результат выборки становился верным. |
|
26.05.2004, 14:07 | #10 |
NavAx
|
Цитата:
Изначально опубликовано Vadik
Объясните, пожалуйста, в чем разница между правильными и неправильными результатами выборки. Если можно, на примере Table1: RecId field1 1 Вася Table2: RecId field1 field2 fieldn 100 Вася Петя value1 101 Вася Петя value2 Правильно (с моей точки зрения, похоже и с Вашей) : Table1.RecId Table2.RecId Table1.Field1 Table2.Field1 Table2.Field2 Table2.Fieldn 1 100 Вася Вася Петя value1 1 101 Вася Вася Петя value2 Имеем на данный момент: Table1.RecId Table2.RecId Table1.Field1 Table2.Field1 Table2.Field2 Table2.Fieldn 1 100 Вася Вася Петя value1 1 100 Вася Вася Петя value1 Вот собсттвенно, думаю наглядный пример. Извиняюсь, что возможно первоначально не полностью описал ситуацию.
__________________
Чудес не бывает (c), истина где-то рядом (c)... |
|
26.05.2004, 14:14 | #11 |
NavAx
|
to Garic:
Да, в этом случае используется указатель на запись а не ее копия, но не думаю что это может действительно быть причиной ошибочной ситуации, поскольку указатель каждый раз внутри цикла переназначается на новую запись из table2. Или я ошибаюсь в чем-то?
__________________
Чудес не бывает (c), истина где-то рядом (c)... |
|
27.05.2004, 12:31 | #12 |
NavAx
|
Беда, товарищи. Уже с ума схожу - ничего не выходит.
Каким-то образом указатель не слезает с первой записи в table2: - сколько бы ни вводил строк - все равно выбирается только первая, зато столько раз, сколько и было бы положено; - меняю, удаляю, добавляю - одно и тоже. подсказка: RPayCalculate_StandardDeduction -метод calcCommon please, help me!
__________________
Чудес не бывает (c), истина где-то рядом (c)... |
|
27.05.2004, 12:50 | #13 |
Модератор
|
Перед тем, как искать ошибки в коде, стоит еще раз внимательно посмотреть на свои данные. Напишите запрос вручную, посмотрите на его результаты. Сильно удивлюсь, если они будут отличаться от тех, что видны при отладке, по крайней мере, на первом операторе внутри while select
|
|
27.05.2004, 14:41 | #14 |
NavAx
|
По-моему я уже указывал, что писал job и что там все в порядке (это первое, что было сделано), с того момента и начал сильно удивлятся. И даже переписывал его с участием common - все замечательно.
__________________
Чудес не бывает (c), истина где-то рядом (c)... |
|
27.05.2004, 17:32 | #15 |
NavAx
|
Кому интересно: проблема локализована.
Если образно, то проблема заключается в одной строке (преобразование через common и обратно, но суть не меняется): PHP код:
Всем спасибо за участие (сочувствие )
__________________
Чудес не бывает (c), истина где-то рядом (c)... |
|