:: Архив конференции по VFP до 2005 года
Проблемы с SQL запросом
Димон
Автор

Сообщений: 59
Откуда: Сеть
Дата регистрации: 04.09.2000
Есть вот такой запрос

SELECT * FROM operate!owners LEFT JOIN operate!status;
LEFT JOIN operate!bank;
ON Owners.статус = Status.Masterkey;
ON Owners.мастер_банка = Bank.masterkey ;
WHERE Owners.masterkey=ln_Mst INTO CURSOR ANK_TMP

Проблема в том, что если в одной из присоединенных таблиц STATUS или BANK нет записей удовлетворяющих запросу то запрос не выполняется в части присоединенных таблиц.
Т.е. если OWNERS.STATUS=1 и в таблице STATUS есть запись с MASTERKEY=1, а OWNERS.МАСТЕР_БАНКА=1 и в BANK нет записи с MASTERKEY=1 то все значения возвращаемые из статус NULL. Хотя должны быть NULL только для полей BANK.

Целый день мучаюсь, Димон.

Ratings: 0 negative/0 positive
RE: Проблемы с SQL запросом
ВладимирМ

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
1. При использовании опции JOIN важен ПОРЯДОК вызова таблиц. Я так понимаю, что ты хочешь получить ВСЕ записи из таблицы owners и дочерние записи из других таблиц. Возможны 2 варианта решения проблемы:
а) ... status Right Join owners Left Join bank
б) насколько я вижу, ты создал запрос через дизайнер, так вот дизайнер с JOIN формирует НЕВЕРНЫЙ синтаксис. Должно быть: ... owners LEFT JOIN status ON ... LEFT JOIN bank ON ... т.е. ключевое слово "ON" СРАЗУ за "JOIN", нельзя несколько "JOIN", а затем несколько "ON", в противном случае SQL может не понять "кто на ком стоял"

2. Ну и проверь SET COLLATE TO "MACHINE", дело в том, что при использовании запросов из нескольких таблиц НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ SET COLLATE TO "RUSSIAN", в противном случае ты рискуешь потерять часть записей в выборке.
Ratings: 0 negative/0 positive
Точно! И еще вопросик.
Димон
Автор

Сообщений: 59
Откуда: Сеть
Дата регистрации: 04.09.2000
Абсолютно точно. Переставил за каждым LEFT JOIN свой ON и все заработало. Большое спасибо. Есть еще один вопрос. Если в связанной таблице нет записи то в результате возвращается значение NULL. Как запретить NULL значения, т.е. чтобы просто возвращалось пустое значение.
SET NULL OFF ставил - не помогает.

Димон.
Ratings: 0 negative/0 positive
set nulldisplay to
Игорь Ильин
set nulldisplay to ""

Если нужны действительно пустые записи (которые не выглядят пробелами, а являются ими), можно попробовать такую конструкцию

select iif( isnull(table1.field1), space(20), table1.field1 ) ... from ... left join ...

20 - это длина поля table1.field1(иначе могут возникнуть сложности)

P.S. Идею на работоспособность не проверял
Ratings: 0 negative/0 positive
К вопросу о NULL
ВладимирМ

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
Дело в том, что по умолчанию убрать NULL не получится. Есть 2 способа решения:
1. Выполнить запрос, а затем REPLACE FOR IsNull(MyField) MyField with ""
2. В запросе, вместо имени поля указать функцию, например:
SELECT nvl(MyField,"") as MyField from MyTable

NVL() - возвращает первое из 2 значений отличное от NULL
или можешь ипользовать IIF() и IsNull()
Ratings: 0 negative/0 positive


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

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

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