:: Visual Foxpro, Foxpro for DOS
Inner join не срабатывает
natashik319
Автор

Сообщений: 30
Дата регистрации: 16.05.2017
Здравствуйте! Такая проблема. Есть запрос на объединение курсора с таблице, все поля типа char, длина полей одинаковая, но курсор получается пустой. При этом если объединять по полю name, то все работает, но когда добавляешь второе поле, то хрен. Вот аналог кода.
Select cursor1.name,table1.adress;
From cursor1;
Inner join table1;
On cursor1.name+cursor1.dom=; table1.name+table1.number;
Into cursor cursor2
Ratings: 0 negative/0 positive
Re: Inner join не срабатывает
of63

Сообщений: 25254
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Наверное, без примера с реальными данными не угадать...
Ratings: 0 negative/0 positive
Re: Inner join не срабатывает
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
natashik319
cursor1.name+cursor1.dom=; table1.name+table1.number;
Вы считаете вот ЭТО нормальным логическим выражением? Как его должен, по вашему мнению, обработать фокс? И словами " добавляешь второе поле" вы называете использование "cursor1.name+cursor1.dom" вместо "cursor1.name"?

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Inner join не срабатывает
natashik319
Автор

Сообщений: 30
Дата регистрации: 16.05.2017
Да, всегда все срабатывало и фокс нормально отрабатывал, но конкретно в этом случае нет.
Насчет второго поля вы правильно поняли.Даже если вместо плюсов поставлю AND все равно.



Исправлено 2 раз(а). Последнее : natashik319, 20.10.17 09:45
Ratings: 0 negative/0 positive
Re: Inner join не срабатывает
natashik319
Автор

Сообщений: 30
Дата регистрации: 16.05.2017
Так, ладно, с AND вроде сработало в этот раз.. странно конечно..
Ratings: 0 negative/0 positive
Re: Inner join не срабатывает
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
natashik319
Да, всегда все срабатывало и фокс нормально отрабатывал, но конкретно в этом случае нет.
Не верю! (С)
Цитата:
Насчет второго поля вы правильно поняли.Даже если вместо плюсов поставлю AND все равно.
То есть так:
cursor1.name and cursor1.dom=; table1.name and table1.number;
?
Считаете это корректным логическим выражением?


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Inner join не срабатывает
of63

Сообщений: 25254
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
А вроде все работает... Точку с запятой - просто не скопировался перевод строки, наверное.
SELECT 0
CREATE CURSOR a1 (name C(20), dom C(20))
INSERT INTO a1 (name, dom) VALUES ("Ульянова", "1")
INSERT INTO a1 (name, dom) VALUES ("Ленина", "12")
INSERT INTO a1 (name, dom) VALUES ("Центральная", "123")
SELECT 0
CREATE CURSOR a2 (name C(20), dom C(20))
INSERT INTO a2 (name, dom) VALUES ("Ульянова", "1")
INSERT INTO a2 (name, dom) VALUES ("Ленина", "12")
INSERT INTO a2 (name, dom) VALUES ("Центральная", "4")
SELECT 0
Select a1.name,a2.name;
From a1;
Inner join a2;
On a1.name+a1.dom=;
a2.name+a2.dom
Ratings: 0 negative/0 positive
Re: Inner join не срабатывает
natashik319
Автор

Сообщений: 30
Дата регистрации: 16.05.2017
Смысл мне врать, скажите пожалуйста, если я просила помощи? В ответ вижу лишь язвительные высказывания с вашей стороны.
Нет, не так, само собой.Не держите меня за дуру, пожалуйста.
Cursor1.name=table1.name and ; cursor1.dom=table1.number.
Ratings: 0 negative/1 positive
Re: Inner join не срабатывает
natashik319
Автор

Сообщений: 30
Дата регистрации: 16.05.2017
of63
А вроде все работает... Точку с запятой - просто не скопировался перевод строки, наверное.
SELECT 0
CREATE CURSOR a1 (name C(20), dom C(20))
INSERT INTO a1 (name, dom) VALUES ("Ульянова", "1")
INSERT INTO a1 (name, dom) VALUES ("Ленина", "12")
INSERT INTO a1 (name, dom) VALUES ("Центральная", "123")
SELECT 0
CREATE CURSOR a2 (name C(20), dom C(20))
INSERT INTO a2 (name, dom) VALUES ("Ульянова", "1")
INSERT INTO a2 (name, dom) VALUES ("Ленина", "12")
INSERT INTO a2 (name, dom) VALUES ("Центральная", "4")
SELECT 0
Select a1.name,a2.name;
From a1;
Inner join a2;
On a1.name+a1.dom=;
a2.name+a2.dom

Спасибо) да, похоже на то)
я же говорю, все отрабатывает фокс) уже сделала, получилось))
Ratings: 0 negative/0 positive
Re: Inner join не срабатывает
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
Конкатенировать две строки, а потом их сравнивать? А не сильно затратно получается? А индексы по выражению конкатенации есть?
Ratings: 0 negative/0 positive
Re: Inner join не срабатывает
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
natashik319
Смысл мне врать, скажите пожалуйста, если я просила помощи? В ответ вижу лишь язвительные высказывания с вашей стороны.
Во-первых, где увидено обвинение во вранье?
Во-вторых, где увидены "язвительные высказывания"?
Может уменьшим количество мнительности и экспрессии?
Цитата:
Нет, не так, само собой.Не держите меня за дуру, пожалуйста.
А кто-то держит? Доказательства будут?
Цитата:
Cursor1.name=table1.name and ; cursor1.dom=table1.number.
А про такое выражение кто-то что-то где-то говорил? Может потрудимся и научимся таки правильно излагать свои мысли?

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Inner join не срабатывает
natashik319
Автор

Сообщений: 30
Дата регистрации: 16.05.2017
1



Исправлено 1 раз(а). Последнее : natashik319, 20.10.17 15:41
Ratings: 0 negative/0 positive
Re: Inner join не срабатывает
natashik319
Автор

Сообщений: 30
Дата регистрации: 16.05.2017
ssa
Во-первых, где увидено обвинение во вранье?
Во-вторых, где увидены "язвительные высказывания"?
Может уменьшим количество мнительности и экспрессии?
Вы серьезно? Какая именно моя фраза является для вас не понятной? Вы сами сказали, что не верите мне. Ни эта ли ваша фраза напрямую указывает на то, что я, якобы, вру? Перечитайте, не найдете ничего язвительного, то тогда и говорить не о чем. Кстати, я абсолютно спокойна. Не знаю, где вы увидели экспрессию в моей печатной речи.
Цитата:
А про такое выражение кто-то что-то где-то говорил? Может потрудимся и научимся таки правильно излагать свои мысли?
Вы говорили про такое выражение.
Цитата:
То есть так:
cursor1.name and cursor1.dom=; table1.name and table1.number.
Считаете это корректным логическим выражением?
Естественно, что нет, поэтому я и написала корректный и логический код. Но и мой первый вариант был работающий,хотя вы же мне не верите. Еще раз, я просила помощи, от вас ее не было. Думаю, стоит закончить этот разговор, вопрос закрыт, проблема решена.



Исправлено 2 раз(а). Последнее : natashik319, 20.10.17 15:58
Ratings: 0 negative/0 positive
Re: Inner join не срабатывает
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Ой зря наезжаете!
ssa
natashik319
cursor1.name+cursor1.dom=; table1.name+table1.number;
Вы считаете вот ЭТО нормальным логическим выражением? Как его должен, по вашему мнению, обработать фокс? И словами " добавляешь второе поле" вы называете использование "cursor1.name+cursor1.dom" вместо "cursor1.name"?
natashik319
Да, всегда все срабатывало и фокс нормально отрабатывал, но конкретно в этом случае нет.
Так никогда не могло работать!
Чему и не поверили!
А Олег привел рабочий код.
Замените в его коде, на ваше
SELECT 0
Select a1.name,a2.name;
From a1;
Inner join a2;
On a1.name+a1.dom=; a2.name+a2.dom
И работать не будет
Синтаксис в программировании... наше все)))

По мне так перенос строки тут явно не помогает читабельности
Я бы написал так)
SELECT 0
Select a1.name,a2.name;
From a1;
Inner join a2;
On (a1.name+a1.dom) = (a2.name+a2.dom)
Хотя очень большие вопросы в полной работоспособности такого запроса.
Вариант с and мне лучше)


------------------




Исправлено 1 раз(а). Последнее : Аспид, 20.10.17 16:09
Ratings: 0 negative/0 positive
Re: Inner join не срабатывает
natashik319
Автор

Сообщений: 30
Дата регистрации: 16.05.2017
Аспид
Ой зря наезжаете!
А разве это наезд с моей стороны? Можно же было сразу человеку нормально ответить,
что так и так, считаю что неправильно. Лучше сделать так. Нет же, надо обязательно съязвить.
Цитата:
natashik319
Да, всегда все срабатывало и фокс нормально отрабатывал, но конкретно в этом случае нет.
Так никогда не могло работать!
Чему и не поверили!
А Олег привел рабочий код.
Замените в его коде, на ваше
SELECT 0
Select a1.name,a2.name;
From a1;
Inner join a2;
On a1.name+a1.dom=; a2.name+a2.dom
И работать не будет
Синтаксис в программировании... наше все)))

По мне так перенос строки тут явно не помогает читабельности
Я бы написал так)
SELECT 0
Select a1.name,a2.name;
From a1;
Inner join a2;
On (a1.name+a1.dom) = (a2.name+a2.dom)
Хотя очень большие вопросы в полной работоспособности такого запроса.
Вариант с and мне лучше)
У меня все срабатывает, говорю же. Это не мой код, он работал несколько лет, но сейчас нужно было сменить источник данных для курсора, а соответственно названия полей в курсоре, что я и сделала. И все перестало работать.
Ratings: 0 negative/0 positive
Re: Inner join не срабатывает
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Вообще-то фокс не исполнит запрос где нечто типа
cursor1.name+cursor1.dom=; table1.name+table1.number;
будет на одной строке - это банальная синтаксическая ошибка, и такой код не компилируется. Поэтому я воспринял это как просто опечатку, сбившееся форматирование при помещении текста на форум.
Но в общем и целом никакой проблемы в выражении
cursor1.name+cursor1.dom=table1.name+table1.number
нет. Скобки тут ни к чему, равно как и переписывать в вид
cursor1.name = table1.name and cursor1.dom = table1.number
в общем случае не требуется. "Правильным" будет тот вариант, который соответствует индексным выражениям в этих 2 таблицах/курсорах. Если там по 2 отдельных индекса по названию улицы и по номеру дома, то правильно (оптимально) использовать запрос с AND и 2-мя отдельными сравнениями. Если там по одному составному индексу с выражением name+dom - то оптимально именно условие со сравнением сцепленных строк. Конечно же, типы полей должны быть character и их размеры должны совпадать.
Естественно что такого рода сравнения строк имеют свои нюансы. Во-первых регистр. Если не работать при COLLATE=RUSSIAN, то "Красная", "красная" и "КРАСНАЯ" это будут три совершенно разные строки. Во-вторых выравнивание, или ведущие/хвостовые пробелы. В том же поле с номерами домов может быть вбито как "1", так и " 1" - и для фокса это, конечно же, будут совершенно разные строки. Хвостовые пробелы не должны влиять для char полей одного размера - т.е. любая строка будет дополнена пробелами до размера поля. Но если попытаться "чинить" результат запроса применяя LTRIM/ALLTRIM, то уже и хвостовые пробелы будут иметь значение - а точнее настройка SET ANSI, влияющая на сравнение строк разного размера...
Кроме того, хотя это и наименее вероятная причина "проблем", на результат может влиять наличие у таблицы индексного файла - точнее его "некорректность", "испорченность" - если фокс станет для оптимизации использовать индекс, а он не соответствует данным в таблице, ну тут то и получится "странный результат".


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Inner join не срабатывает
natashik319
Автор

Сообщений: 30
Дата регистрации: 16.05.2017
Igor Korolyov
Кроме того, хотя это и наименее вероятная причина "проблем", на результат может влиять наличие у таблицы индексного файла - точнее его "некорректность", "испорченность" - если фокс станет для оптимизации использовать индекс, а он не соответствует данным в таблице, ну тут то и получится "странный результат".
Возможно и так, потому что поля источников идентичны. Ну т.е. тут точно проблема не в них самих. Надо будет в понедельник тогда заново сделать индексацию таблицы. Спасибо, думаю вы правы.
Ratings: 0 negative/0 positive
Re: Inner join не срабатывает
of63

Сообщений: 25254
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Тут не "заново" (REINDEX) сделать имелось ввиду, а посмотреть:
- SET("COLLATE"), SET("ANSI"), что-то еще
- посмотреть какие индексы есть в таблицах (если они "большого" размера)
- оценить выражения поиска (и JOIN) с имеющимися выражениями индекса и COLLATE (скорее всего COLLATE=RUSSIAN, раз исходный код на регистре не заморачивается)
- если все достаточно быстро и так работает, то лучше пока ничего не менять )
Ratings: 0 negative/0 positive
Re: Inner join не срабатывает
natashik319
Автор

Сообщений: 30
Дата регистрации: 16.05.2017
of63
Тут не "заново" (REINDEX) сделать имелось ввиду, а посмотреть:
- SET("COLLATE"), SET("ANSI"), что-то еще
- посмотреть какие индексы есть в таблицах (если они "большого" размера)
- оценить выражения поиска (и JOIN) с имеющимися выражениями индекса и COLLATE (скорее всего COLLATE=RUSSIAN, раз исходный код на регистре не заморачивается)
- если все достаточно быстро и так работает, то лучше пока ничего не менять )
Поняла) спасибо, да с And работает, но ради интереса посмотрю ваш вариант)
Ratings: 0 negative/0 positive
Re: Inner join не срабатывает
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Если работает с AND и НЕ работает по "сцепке", при том размеры полей гарантировано одинаковые, то дело скорее всего в индексе...


------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 15 (Гостей: 15)

© 2000-2024 Fox Club 
Яндекс.Метрика